【发布时间】:2018-06-23 04:00:35
【问题描述】:
我继承了一个生成 .so 文件的 Makefile。它使用 gcc 4.7.4 在 Ubuntu 上与来自 OpenSSL 的 -lcrypto 链接。至关重要的是,它没有与-lssl 或-ldl 链接,当我运行nm -g thelib.so 时,它只有来自openssl 加密的~15 个符号。但是,它们都是U(未定义)。
我正在另一台 Ubuntu 机器上重构 Makefile。当我与-lcrypto 链接时,由于dl 需要未定义的符号而失败。当我添加到-ldl 的链接时,这些错误消失并且链接成功。但是,我的.so 文件比原始文件大1.5 MB,并且至少有一百个与SSL 相关的符号,它们都是T(已定义),这似乎表明-lssl 正在以某种方式隐式发生。
虽然在我的案例中定义它们似乎是谨慎和好的,但我需要弄清楚如何产生相同的结果。
所以,我的问题是,如何让 GCC 允许链接 .so 文件并接受未定义的引用?我比较了我们的命令,我试图消除一些差异,但似乎没有任何效果。我读到它可能与-Wl,--no-as-needed 有关,但我正在使用它。这是我的链接器标志。
g++ -shared -o mylib.so myobjs.o -fPIC -lstdc++ -lm -z defs -Wl,-soname,mylib -Wl,--no-as-needed -lpthread -lcrypto -lz
【问题讨论】:
-
你知道这个
g++链接器步骤最终使用的是哪个-lcrypto库吗?出于您的目的,它应该是一个动态库,而不是它的静态版本。 -
@ReinierTorenbeek 谢谢你,这显然是答案,我从 Ubuntu 安装了 openssl-devel,并与之链接,它工作正常。