我正在建立一个共享库(我们将其称为“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/15318978/

    10-11 18:41