OS X上带有胖库的架构x86_64的未定义符号

时间:2015-03-09 14:06:42

标签: c++ c xcode macos openssl

我自己从源代码构建libcrypto.alibssl.a,指定darwin64-x86_64-cc(对于64位)和darwin-i386-cc(对于32位)指向{{1}配置脚本。
使用OpenSSL创建了胖库,并将它们作为依赖项添加到我的lipo项目中。

但是,我收到一个未定义的符号错误:

Xcode

注意:不过,使用相同的技术适用于iOS。

undefined symbols for architecture x86_64: "_OPENSSL_ia32cap_P", referenced from: _AES_cbc_encrypt in libcrypto.a(aes-x86_64.o) ld: symbol(s) not found for architecture x86_64 显示:

lipo -detailed_info libcrypto.a

2 个答案:

答案 0 :(得分:16)

在静态库案例中,它似乎是x64代码生成器中的一个错误。

最简单的非补丁openssl更改解决方法是在代码中的某处添加对OPENSSL_cleanse的引用,即使它未被使用。这将修复链接时参考。

实际发生的是该符号在某些汇编代码中被引用。

汇编代码简单地说_OPENSSL_ia32cap_P是一个外部符号,没有使交叉链接指出它需要链接。这适用于libcrypto.dylib,因为引用在生成时被解析.dylib文件;但是,在.a情况下永远不会解析引用,因为实际包含该符号的唯一代码是x86_64cpuid.o,只有在您使用.o提供的任何例程时才会链接到该代码

此文件中的符号包含OPENSSL_cleanse,因此,如果您引用此例程,则链接可以正常工作。

答案 1 :(得分:1)

我偶然发现了相同的链接器错误,并且我还尝试添加extern int OPENSSL_cleanse(void *ptr, size_t len);行,但没有成功。

最终对我有用的是在您的代码文件中的任何位置添加以下行:

uint32_t OPENSSL_ia32cap_P[4] = { 0 };

我还使用以下链接作为参考:(found here)