2016-04-15 14 views
2

Ich versuche, git2go mit statischen libgit2, openssl und libssh2 zu kompilieren. Mein Endziel ist es, in der Lage zu sein, eine go Binärdatei zu kompilieren, die bereitgestellt werden kann, ohne dass diese Bibliotheken installiert werden müssen. Ich fand eine ähnliche question auf SO, die ich verwendet habe, die folgenden Skripte zu erstellen, die die Bibliotheken bauenLIBSSH2 und dso_dlfcn.c: ... undefinierter Verweis auf `dlopen '

OPENSSL:

#!/bin/sh 

set -ex 
INSTALL_PATH="$PWD/install" 
SUBMODULE_PATH="$PWD/submodules/openssl" 

cd $SUBMODULE_PATH && 
mkdir -p $INSTALL_PATH/lib && 
mkdir -p build && 

# Switch to a stable version 
git checkout OpenSSL_1_0_2-stable && 
./config threads no-shared --prefix=$INSTALL_PATH -fPIC -DOPENSSL_PIC && 
make depend && 
make && 
make install 

libssh2:

#!/bin/sh 

set -ex 

INSTALL_PATH="$PWD/install" 
SUBMODULE_PATH="$PWD/submodules/libssh2" 

# without this, the system's openssl shared object gets linked in 
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$INSTALL_PATH/lib/pkgconfig:$INSTALL_PATH/lib64/pkgconfig" 

cd $SUBMODULE_PATH && 
mkdir -p $INSTALL_PATH/lib && 
mkdir build 
cd build && 
cmake -DTHREADSAFE=ON \ 
     -DBUILD_CLAR=OFF \ 
     -DBUILD_SHARED_LIBS=OFF \ 
     -DCMAKE_C_FLAGS=-fPIC \ 
     -DCMAKE_BUILD_TYPE="RelWithDebInfo" \ 
     -DCMAKE_INSTALL_PREFIX=$INSTALL_PATH \ 
     .. && 

cmake --build . 
make install 

ich den folgenden Patch auf eine Anwendung Skript in git2go Zweig next, die libgit2 in einem Versuch erstellt, um sicherzustellen, dass PKG_CONFIG_PATH verweist auf die statische openssl und libssh2 Bibliothek s

LIBGIT2:

--- build-libgit2-static.sh.orig 2016-04-14 22:49:53.000000000 -0700 
+++ build-libgit2-static.sh 2016-04-14 22:52:04.000000000 -0700 
@@ -2,10 +2,12 @@ 

set -ex 

-VENDORED_PATH=vendor/libgit2 
+INSTALL_PATH="$PWD/install" 
+VENDORED_PATH="$PWD/submodules/git2go/vendor/libgit2" 
+export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$INSTALL_PATH/lib/pkgconfig:$INSTALL_PATH/lib64/pkgconfig" 

cd $VENDORED_PATH && 
-mkdir -p install/lib && 
+mkdir -p $INSTALL_PATH/lib && 
mkdir -p build && 
cd build && 
cmake -DTHREADSAFE=ON \ 
@@ -13,7 +15,8 @@ 
     -DBUILD_SHARED_LIBS=OFF \ 
     -DCMAKE_C_FLAGS=-fPIC \ 
     -DCMAKE_BUILD_TYPE="RelWithDebInfo" \ 
-  -DCMAKE_INSTALL_PREFIX=../install \ 
+  -DCMAKE_INSTALL_PREFIX=$INSTALL_PATH \ 
     .. && 

cmake --build . 
+make install 

Dieses Setup erstellt schließlich ein lokales install Verzeichnis, das alle Bibliotheken installiert ist. Ich kompiliere openssl mit dem obigen Skript. Dann erhalten die folgende Ausgabe, wenn libssh2 Kompilieren:

... 
Found OpenSSL: (path to project)/install/lib/libssl.a;(path to project)/install/lib/libcrypto.a (found version "1.0.2h-dev") 
... 
Linking C static library libssh2.a 
gmake[3]: Leaving directory `(path to project)/submodules/libssh2/build' 
[ 46%] Built target libssh2 
gmake[3]: Entering directory `(path to project)/submodules/libssh2/build' 
Scanning dependencies of target example-direct_tcpip 
gmake[3]: Leaving directory `(path to project)/submodules/libssh2/build' 
gmake[3]: Entering directory `(path to project)/submodules/libssh2/build' 
[ 48%] Building C object example/CMakeFiles/example-direct_tcpip.dir/direct_tcpip.c.o 
Linking C executable example-direct_tcpip 
(path to project)/install/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': 
dso_dlfcn.c:(.text+0x11): undefined reference to `dlopen' 
dso_dlfcn.c:(.text+0x24): undefined reference to `dlsym' 
dso_dlfcn.c:(.text+0x2f): undefined reference to `dlclose' 
(path to project)/install/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func': 
dso_dlfcn.c:(.text+0x354): undefined reference to `dlsym' 
dso_dlfcn.c:(.text+0x412): undefined reference to `dlerror' 
(path to project)/install/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var': 
dso_dlfcn.c:(.text+0x484): undefined reference to `dlsym' 
dso_dlfcn.c:(.text+0x542): undefined reference to `dlerror' 
(path to project)/install/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': 
dso_dlfcn.c:(.text+0x5a9): undefined reference to `dlopen' 
dso_dlfcn.c:(.text+0x60d): undefined reference to `dlclose' 
dso_dlfcn.c:(.text+0x645): undefined reference to `dlerror' 
(path to project)/install/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_pathbyaddr': 
dso_dlfcn.c:(.text+0x6d1): undefined reference to `dladdr' 
dso_dlfcn.c:(.text+0x731): undefined reference to `dlerror' 
(path to project)/install/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_unload': 
dso_dlfcn.c:(.text+0x792): undefined reference to `dlclose' 
collect2: error: ld returned 1 exit status 
gmake[3]: Leaving directory `(path to project)/submodules/libssh2/build' 
gmake[2]: Leaving directory `(path to project)/submodules/libssh2/build' 
gmake[1]: Leaving directory `(path to project)(path to project)/submodules/libssh2/build' 
gmake[3]: *** [example/example-direct_tcpip] Error 1 
gmake[2]: *** [example/CMakeFiles/example-direct_tcpip.dir/all] Error 2 
gmake[1]: *** [all] Error 2 
make: *** [build-libssh2] Error 2 

Sie können sehen, dass die statische openssl verwendet wird. Offensichtlich wird libdl nicht mit libcrypto verknüpft. Die Ausgabe beim Kompilieren openssl hat EX_LIBS=-ldl. Sollte dies die Bibliothek beinhalten? Ich habe versucht, LDLIBS=-ldl in openssl Installationsskript, aber immer noch den gleichen Fehler. Ich habe fast jede SO-Antwort für den Suchbegriff libcrypto undefined reference to 'dlopen' vergeblich versucht. Jede mögliche Hilfe würde viel

+0

Siehe auch [Fehler libcrypto library nicht gefunden] (http://stackoverflow.com/q/10368671) und der Kommentar * "Sie müssen' -ldl' hinzufügen, wenn Sie den letzten Link "* ausführen. Auch, * "Ich habe versucht, LDLIBS = -ldl in der openssl-Installation zu verwenden ..." * - libssh hat die Probleme, nicht libcrypto. – jww

+0

@jww wenn Libssh nach der Referenz sucht, warum sagt der Fehler libcrypto.a ... undefined Referenz ...? Ein bisschen verwirrend – arynhard

+0

'libcrypto.a' hat die Abhängigkeit. Sie könnten Ihr endgültiges Programm oder 'libssh2' verknüpfen - in beiden Fällen müssen Sie' -ldl' hinzufügen, weil es eine Abhängigkeit ist. OpenSSL kompiliert und verbindet sich damit, daher ist OpenSL keine offene Abhängigkeit, wenn OpenSSL erstellt wird.Sie können OpenSSLs Verwendung der Dateisteuerungsfunktionen durch Konfigurieren mit 'no-dso' entfernen. – jww

Antwort

0

geschätzt werden, da ich bin nicht vertraut mit pig-config Ich wechselte zu Autoconf:

#!/bin/sh 

set -ex 

INSTALL_PATH="$PWD/install" 
SUBMODULE_PATH="$PWD/submodules/libssh2" 

mkdir -p $INSTALL_PATH/lib && 
cd $SUBMODULE_PATH && 
./buildconf 
./configure --prefix=$INSTALL_PATH --libdir=$INSTALL_PATH/lib64 --with-openssl CFLAGS="-fPIC" LDFLAGS="-m64 -L$INSTALL_PATH/lib -L$INSTALL_PATH/lib64" LIBS=-ldl 
make 
make install 

Diese erfolgreich kompiliert.

0

Ich fand heraus, dass das Hinzufügen target_link_libraries(libssh2 ${CMAKE_DL_LIBS}) zu src/CMakeLists.txt (wie erklärt here) löst das Problem in der Frage erwähnt. Beachten Sie, dass ich libssh2-1.8.0 und das neueste OpenSSL (5de683d) verwende, aber ich denke, es ist die gleiche Geschichte mit OpenSSL_1_0_2-stable.

So ist der libssh2 Build-Code, der funktioniert, ist:

# inside libssh2 root 
printf '\ntarget_link_libraries(libssh2 ${CMAKE_DL_LIBS})' >> src/CMakeLists.txt 
mkdir build && cd build 
cmake -DTHREADSAFE=ON \ 
     -DBUILD_CLAR=OFF \ 
     -DBUILD_SHARED_LIBS=OFF \ 
     -DCMAKE_C_FLAGS=-fPIC \ 
     -DCMAKE_BUILD_TYPE="RelWithDebInfo" \ 
     -DCMAKE_INSTALL_PREFIX=$INSTALL_PATH \ 
     .. && 
cmake --build . 
make install 

Hinweis: Ich musste auch target_link_libraries(libssh2 pthread) hinzufügen, weil ich nicht definierte Verweise auf pthread mit den neuesten Versionen wurde immer.