我正在建立一个共享库(我们将其称为“ foo”),该共享库利用了另一个库(我们将其称为“ bar”)。 “ bar”利用了OpenSSL的某些功能。

问题出在这里。

“ bar”被编译为静态库,并且似乎OpenSSL也是如此。因此,当我链接库(“ foo”)时,我包括:


“ foo”的目标文件
静态库libbar.a
OpenSSL静态库libcrypto.alibssl.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.alibssl.a的顺序可以解析所有符号。

默认情况下,GCC使用LD及其单通链接程序。当您具有两个按特定顺序链接的库(例如libssllibcrypto)时,这意味着libssl依赖于libcrypto中的符号。因此,libssl必须在libcrypto之前(或libcrypto必须在libssl之后)。 libssl依赖libcrypto并不奇怪,因为libcrypto提供了libssl使用的加密货币。

关于gcc - 涉及一堆明显存在的 Unresolved OpenSSL符号的错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38372737/

10-09 08:42