C++ 带fat库的OS X上架构x86_64的未定义符号
我已经从源代码构建了C++ 带fat库的OS X上架构x86_64的未定义符号,c++,c,xcode,macos,openssl,C++,C,Xcode,Macos,Openssl,我已经从源代码构建了libcrypto.a和libssl.a,指定darwin64-x86\u 64-cc(64位)和darwin-i386-cc(32位)来配置OpenSSL 使用lipo创建fat库,并将它们作为依赖项添加到我的Xcode项目中 但是,我得到一个未定义的符号错误: undefined symbols for architecture x86_64: "_OPENSSL_ia32cap_P", referenced from: _AES_cbc_encrypt
libcrypto.a
和libssl.a
,指定darwin64-x86\u 64-cc
(64位)和darwin-i386-cc
(32位)来配置OpenSSL
使用
lipo
创建fat库,并将它们作为依赖项添加到我的Xcode
项目中
但是,我得到一个未定义的符号错误:
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
注意:不过,在iOS上使用相同的技术也可以
lipo-详细信息libcrypto.a
显示:
Fat header in: libcrypto.a
fat_magic 0xcafebabe
nfat_arch 2
architecture i386
cputype CPU_TYPE_I386
cpusubtype CPU_SUBTYPE_I386_ALL
offset 48
size 2700624
align 2^2 (4)
architecture x86_64
cputype CPU_TYPE_X86_64
cpusubtype CPU_SUBTYPE_X86_64_ALL
offset 2700672
size 3938432
align 2^2 (4)
在静态库的情况下,x64的代码生成器中似乎有一个bug 最简单、无补丁的openssl更改解决方案是在代码中的某个地方添加对
openssl\u cleanse
的引用,即使它没有被使用。这将修复链接时间参考
实际发生的情况是,符号在某些汇编代码中被引用
汇编代码只是简单地说,\u OPENSSL\u ia32cap\u p
是一个外部符号,而没有使交叉链接声明它需要在中链接。这适用于libcrypto.dylib
,因为在生成.dylib
文件时会解析引用;但是,在.a
情况下,引用永远不会解析,因为实际包含符号的唯一代码是x86\u 64cpuid.o
,只有在使用该.o
提供的任何例程时,才会链接到中
此文件中的符号包括
OPENSSL\u clean
,因此如果引用此例程,链接将正常工作。我偶然发现了相同的链接器错误,并且我还尝试添加行extern int OPENSSL\u clean(void*ptr,size\t len)代码>没有成功
最终对我有效的是在代码文件中的任意位置添加以下行:
uint32\u t OPENSSL\u ia32cap\u P[4]={0};
此外,我还使用了以下链接作为参考:您是否安装了这些库的头文件?通常有一个二进制软件包发行版,它只有库,还有一个单独的用于库的devel软件包和用于针对库进行编码的相关头。我已经包含了正确的头。i386和x86_64的头稍有不同。当fat库正确构建(或与lipo
正确组合)时,除一个片段外,所有片段的标题都会稍微偏离。但彼得是对的。我似乎记得在某些情况下(比如静态归档)导出了该文件,但在其他情况下(比如共享对象)没有导出。这里提到的问题是使用您的建议我最终做了什么:extern int OPENSSL\u cleanse(void*ptr,size\t len)代码>和代码中任意的地方:OPENSSL\u clean(nil,0)我在编译libevent时遇到了类似的问题。我在代码中添加了OPENSSL_cleanse,但未能修复它,最后我将x86_64cpuid.o路径添加到相对Makefile来修复它。谢谢