gpt4 book ai didi

gcc - 指的是一堆明显存在的未解析 OpenSSL 符号的错误?

转载 作者:行者123 更新时间:2023-12-04 12:33:33 24 4
gpt4 key购买 nike

我正在构建一个共享库(我们称之为“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 符号的链接器错误?

    最佳答案

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

    GCC 使用 LD默认情况下,它是一个单通链接器。当您有两个库时,例如 libssllibcrypto以特定顺序链接,这意味着 libssl取决于来自 libcrypto 的符号.因此,libssl必须先于 libcrypto (或 libcrypto 必须遵循 libssl )。应该不足为奇 libssl依赖 libcryptolibcrypto提供 libssl 使用的加密货币.

    关于gcc - 指的是一堆明显存在的未解析 OpenSSL 符号的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15318978/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com