7

我正在构建一个共享库(我们称之为“foo”),它使用另一个库(我们称之为“bar”)。“bar”利用了 OpenSSL 的一些功能。

这就是问题出现的地方。

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

  • “foo”的目标文件
  • 静态库libbar.a
  • OpenSSL 静态库libcrypto.alibssl.a

构建命令看起来像这样:

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 符号的链接器错误?

4

1 回答 1

4

该问题是由链接命令中的库顺序引起的。切换顺序libcrypto.alibssl.a解析所有符号。

GCCLD默认使用,它是一个单通道链接器。当你有两个库,likelibssllibcrypto以特定顺序链接时,这意味着libssl依赖于libcrypto. 因此,libssl必须先于libcrypto(或libcrypto必须跟随libssl)。由于提供libssl了. _libcryptolibcryptolibssl

于 2013-03-10T21:34:20.670 回答