Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带fat库的OS X上架构x86_64的未定义符号_C++_C_Xcode_Macos_Openssl - Fatal编程技术网

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)