我正在尝试从 SSL 客户端程序调用 SSL_export_keying_material() 方法。但是调用此方法会导致程序编译失败。我收到以下错误。我怎样才能克服这个编译错误?
clang -cc1 version 5.1 based upon LLVM 3.4svn default target x86_64-apple-darwin13.2.0
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.9.0 -o withssl -lssl -lcrypto /var/folders/1b/smlgh1256t95yw11pqs2hz380000gn/T/withssl-08785c.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture x86_64:
"_SSL_export_keying_material", referenced from:
_main in withssl-08785c.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1
谢谢
最佳答案
How can I over come this compilation error?
您需要安装最新版本的 OpenSSL。默认情况下,Apple 提供版本 0.9.8,但不提供 SSL_export_keying_material
:
$ nm /usr/lib/libssl.dylib | grep SSL_export_keying_material
$
这是我的 1.0.1i 副本:
$ nm /usr/local/ssl/macosx-x64/lib/libssl.a | grep SSL_export_keying_material
...
0000000000002810 T _SSL_export_keying_material
00000000000068c8 S _SSL_export_keying_material.eh
以下是如何在 /usr/local/ssl
中获取并安装 OpenSSL 1.0.1i。还有其他可用的config
选项。请参阅Compilation and Installation有关详细信息,请访问 OpenSSL wiki。
wget https://www.openssl.org/source/openssl-1.0.1i.tar.gz
tar xzf openssl-1.0.1i.tar.gz
cd openssl-1.0.1i
export KERNEL_BITS=64
./config enable-ec_nistp_64_gcc_128 --openssldir=/usr/local/ssl
make
sudo make install
之后,请确保针对 /usr/local/ssl
中的 OpenSSL 设备进行编译和链接。
此外,Apple 链接器还会忽略 LD_PRELOAD
、-Bstatic
和 -Wl,--rpath
。请务必使用DYLD_LIBRARY_PATH
(OS X 相当于LD_PRELOAD
)。否则,您将针对 1.0.1(来自 /usr/local/ssl
)进行编译,但在运行时链接至 0.9.8(来自 /usr/lib
)。请参阅dyld(1)
有关 Apple 运行时链接编辑器的一些信息。
如果您针对 1.0.1 进行编译,但针对 0.9.8 进行运行时链接,那么您将遇到无法解释的崩溃。原因并不明显,但这是因为 0.9.8 和 1.0.1 二进制不兼容。
我通常将其放入我的代码中以防止它:
long version = SSLeay();
ASSERT(version == OPENSSL_VERSION_NUMBER);
if (version != OPENSSL_VERSION_NUMBER)
{
/* Handle incorrect version at runtime */
}
上面的代码检查编译时版本与运行时版本是否相同。
关于ssl - SSL_export_keying_material() 的 OpenSSL 编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26031239/