2016-04-15 11 views
2

Я пытаюсь скомпилировать 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' безрезультатно. Любая помощь будет высоко ценится

+0

Также см. [Не удается найти библиотечную ошибку libcrypto] (http://stackoverflow.com/q/10368671) и комментарий * «При выполнении финальной ссылки« * вам нужно добавить «-ldl». Кроме того, * «Я попытался использовать LDLIBS = -ldl в установке openssl ...» * - У libssh возникают проблемы, а не libcrypto. – jww

+0

@jww если libssh ищет ссылку, то почему ошибка говорит libcrypto.a ... undefined reference ...? Немного запутанный – arynhard

+0

'libcrypto.a' имеет зависимость. Вы можете связать свою финальную программу или 'libssh2' - в обоих случаях вам нужно будет добавить' -ldl', потому что это зависимость. OpenSSL компилирует и связывает с ним, поэтому его не неудовлетворительная зависимость при построении OpenSSL.Вы можете удалить OpenSSL, используя функции управления файлами, настроив с помощью 'no-dso'. – jww

ответ

0

Поскольку я не знаком с pig-config я перешел на 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 

Это успешно компилирует.

0

Я узнал, что добавление target_link_libraries(libssh2 ${CMAKE_DL_LIBS}) в src/CMakeLists.txt (как объяснено, here) решает проблему, упомянутую в вопросе. Обратите внимание, что я использую libssh2-1.8.0 и последний OpenSSL (5de683d), но я думаю, что это одна и та же история с OpenSSL_1_0_2-stable.

Так libssh2 код сборки, который работает в:

# 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 

Примечание: Я также должен был добавить target_link_libraries(libssh2 pthread), потому что я получаю неопределенные ссылки на pthread с последними версиями.