我正在建立一个共享库(我们将其称为“ foo”),该共享库利用了另一个库(我们将其称为“ bar”)。 “ bar”利用了OpenSSL的某些功能。
问题出在这里。
“ bar”被编译为静态库,并且似乎OpenSSL也是如此。因此,当我链接库(“ foo”)时,我包括:
“ foo”的目标文件
静态库libbar.a
OpenSSL静态库libcrypto.a
和libssl.a
build命令如下所示:
g++ -Wl,-soname,libfoo.so -shared file1.o file2.o libbar.a \
libcrypto.a libssl.a -o libfoo.so
但是,我遇到很多错误:
ld: ./obj/libbar.a(file1.c.o): in function initialize_openssl:
ssl.c:117: error: undefined reference to 'SSL_library_init'
运行以下命令:
nm libssl.a | grep SSL_library_init
产生以下输出:
00000000 T SSL_library_init
因此,显然,OpenSSL库没有错。可能是什么原因引起了这样的事情?这是用于构建OpenSSL的三个命令:
export cross=arm-linux-androideabi-
./Configure android --prefix=~/openssl-arm
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
编译过程已完成,没有任何错误,因此我感到非常困惑。
为什么我会得到链接错误,这些错误指向一堆明显存在的OpenSSL符号?
最佳答案
该问题是由链接命令中库的顺序引起的。切换libcrypto.a
和libssl.a
的顺序可以解析所有符号。
默认情况下,GCC使用LD
及其单通链接程序。当您具有两个按特定顺序链接的库(例如libssl
和libcrypto
)时,这意味着libssl
依赖于libcrypto
中的符号。因此,libssl
必须在libcrypto
之前(或libcrypto
必须在libssl
之后)。 libssl
依赖libcrypto
并不奇怪,因为libcrypto
提供了libssl
使用的加密货币。
关于gcc - 涉及一堆明显存在的 Unresolved OpenSSL符号的错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38372737/