OPENSSL_LIBS="-llibeay32 -lssleay32"...
避免使用-l
(以及-L
和-Wl,-Bstatic
)。链接器有时会忽略对静态链接的请求(苹果公司),有时脚本会修改它(我无法告诉你有多少自定义构建脚本给我带来了麻烦)。
相反,像使用对象文件一样使用完全指定的存档文件。在您的LDLIBS
中添加以下内容,以便没有脚本可以弄乱事情或链接器忽略您的请求:
/usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a
显然,你应该更改
libssl.a
和
libcrypto.a
的路径以匹配你的安装。
如果你没有
LDLIBS
,那么将其添加到
LDFLAGS
中(或者在 IDE 中添加到“其他链接器标志”中)。
在 Qt 中,看起来应该是
QMAKE_LFLAGS
或
LIBS
。或者你可以尝试这篇文章:
如何添加“其他依赖项”(链接器设置)。
相同的技巧也适用于共享对象(但链接器更喜欢共享对象,所以通常不会成为问题)。也就是说,你可以指定:
/usr/local/ssl/lib/libssl.so /usr/local/ssl/lib/libcrypto.so
指定类似上述共享对象时需要记住的是,您必须指定一个“rpath”以确保运行时链接器得到消息。也就是说,您应该将以下内容添加到“LDFLAGS”或“其他链接器选项”中:
-Wl,-rpath=/usr/local/ssl/lib
我在使用位于
/usr/local/ssl/lib
的OpenSSL FIPS可用库时,当指定共享对象时,有几次被咬了一口,因为运行时链接器使用分发的OpenSSL(位于
/usr/lib
或
/usr/lib64
)。 OpenSSL FIPS可用库是您调用
FIPS_mode_set
的库。
您还可以从该位置删除(或重命名)共享对象,仅留下静态存档。在构建iPhone的Xcode中使用此技术过去曾经是我必须采取的方法。即使正确放置了
-Bstatic
,Xcode仍然拒绝使用静态存档。(交叉编译器和修改后的工具链有时是最糟糕的使用方式之一)。我认为您不应该修改安装目录,因此通常不使用此技术。
总之,不要留给机会,避免使用
-l
,
-L
和
-Wl,-Bstatic
。完全指定您想要的内容,并使用完全限定的库路径名称,并像对象文件一样使用它们。如果您正在指定共享对象,请使用
rpath
。
nmake VERBOSE=
输出以查看传递给工具链的包含路径? - László Papp