Nat*_*man 7 gcc static-linking nm
我正在构建一个共享库(我们称之为"foo"),它使用另一个库(我们称之为"bar")."bar"使用OpenSSL中的一些函数.
这是问题浮出水面的地方.
"bar"被编译为静态库,看起来OpenSSL也是如此.所以当我链接库("foo")时,我包括:
libbar.alibcrypto.a和libssl.abuild命令看起来像这样:
g++ -Wl,-soname,libfoo.so -shared file1.o file2.o libbar.a \
libcrypto.a libssl.a -o libfoo.so
Run Code Online (Sandbox Code Playgroud)
但是,我收到了很多错误:
ld: ./obj/libbar.a(file1.c.o): in function initialize_openssl:
ssl.c:117: error: undefined reference to 'SSL_library_init'
Run Code Online (Sandbox Code Playgroud)
运行以下命令:
nm libssl.a | grep SSL_library_init
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
00000000 T SSL_library_init
Run Code Online (Sandbox Code Playgroud)
显然,OpenSSL库没有任何问题.什么可能导致这样的事情?以下是用于构建OpenSSL的三个命令:
export cross=arm-linux-androideabi-
./Configure android --prefix=~/openssl-arm
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
Run Code Online (Sandbox Code Playgroud)
编译过程完成没有任何错误,所以我完全感到困惑.
为什么我会收到引用明显存在的一堆OpenSSL符号的链接器错误?
该问题是由链接命令中库的顺序引起的。交换所有符号的顺序libcrypto.a并解析。libssl.a
GCC 默认使用LD,并且它是单通道链接器。当您有两个库时,例如libssl和libcrypto以特定顺序链接,这意味着libssl依赖于libcrypto. 因此,libssl必须在 之前libcrypto(或libcrypto必须在 之后libssl)。libssl依赖它应该不足为奇,libcrypto因为libcrypto提供了libssl.