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
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
@jww wenn Libssh nach der Referenz sucht, warum sagt der Fehler libcrypto.a ... undefined Referenz ...? Ein bisschen verwirrend – arynhard
'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