我正在建立一个共享库(我们将其称为“foo”),该共享库利用了另一个库(我们将其称为“bar”)。 “bar”利用了OpenSSL的某些功能。
这是问题浮出水面的地方。
“bar”被编译为静态库,并且似乎OpenSSL也是如此。因此,当我链接库(“foo”)时,我包括了:
“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符号?
最佳答案
该问题是由链接命令中库的顺序引起的。切换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/15318978/