我正在构建一个共享库(我们称之为#34; foo"),它使用另一个库(我们将其称为" bar")。 "杆"利用OpenSSL中的一些函数。
问题出现在哪里。
"杆"编译为静态库,看起来OpenSSL也是如此。因此,当我链接库(" foo")时,我包括:
libbar.a
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符号的链接器错误?
答案 0 :(得分:3)
问题是由链接命令中库的顺序引起的。切换libcrypto.a
和libssl.a
的顺序解决了所有符号。
默认情况下,GCC使用LD
,并且它是单个传递链接器。如果您有两个库,例如按特定顺序链接的libssl
和libcrypto
,则表示libssl
取决于来自libcrypto
的符号。因此,libssl
必须在libcrypto
之前(或libcrypto
必须遵循libssl
)。由于libssl
提供libcrypto
使用的加密,因此libcrypto
依赖于libssl
,这一点不足为奇。