Я пытаюсь скомпилировать git2go
с использованием статических libgit2
, openssl
и libssh2
. Моя конечная цель - собрать компиляцию двоичного файла go
, который можно развернуть без необходимости установки этих библиотек. Я нашел подобный question на SO, который я использовал для создания следующих сценариев, которые строят библиотекиLIBSSH2 и dso_dlfcn.c: ... неопределенные ссылки на `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
Я применяю следующий патч к скрипт в git2go
филиал next
, который строит libgit2
в попытке убедиться, что PKG_CONFIG_PATH
указывает на статические openssl
и libssh2
librarie 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
Эта установка в конечном счете создает локальный install
каталог, в котором есть все библиотеки, установленные на нем. Я компилирую openssl
, используя вышеприведенный скрипт. Тогда получаем следующий результат при компиляции libssh2
:
...
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
Вы можете видеть, что статический openssl
используется. Очевидно, libdl
не связывается с libcrypto
. Выходной сигнал при компиляции openssl
имеет EX_LIBS=-ldl
. Должно ли это включать библиотеку? Я попытался использовать LDLIBS=-ldl
в установочном скрипте openssl
, но по-прежнему та же ошибка. Я пробовал почти каждый ответ SO для поискового запроса libcrypto undefined reference to 'dlopen'
безрезультатно. Любая помощь будет высоко ценится
Также см. [Не удается найти библиотечную ошибку libcrypto] (http://stackoverflow.com/q/10368671) и комментарий * «При выполнении финальной ссылки« * вам нужно добавить «-ldl». Кроме того, * «Я попытался использовать LDLIBS = -ldl в установке openssl ...» * - У libssh возникают проблемы, а не libcrypto. – jww
@jww если libssh ищет ссылку, то почему ошибка говорит libcrypto.a ... undefined reference ...? Немного запутанный – arynhard
'libcrypto.a' имеет зависимость. Вы можете связать свою финальную программу или 'libssh2' - в обоих случаях вам нужно будет добавить' -ldl', потому что это зависимость. OpenSSL компилирует и связывает с ним, поэтому его не неудовлетворительная зависимость при построении OpenSSL.Вы можете удалить OpenSSL, используя функции управления файлами, настроив с помощью 'no-dso'. – jww