构建ARM64时,体系结构x86_64的未定义符号

时间:2015-01-20 11:06:49

标签: ios ios-simulator crypto++

我将cryptopp lib构建为用于ios应用程序。但是没有用,只告诉我

  

“架构x86_64的未定义符号:
  “CryptoPP :: ProxyFilter :: IsolatedFlush(bool,bool)”,引自:“

等等...

我遵循Crypopp wiki页面的指南,但它仍然崩溃。

我该如何解决?

  

ld:警告:忽略文件[path] /libcryptopp.a,缺少必需的   文件[path] /libcryptopp.a中的架构x86_64(4   slice)CryptoPP :: ProxyFilter :: IsolatedFlush(bool,bool)“,引用   来自:...... ......(118件事)


我尝试使用github's prebuilt cryptopp构建,但它也不起作用。它会发生如下错误:

  

架构arm64的未定义符号:    “CryptoPP :: BufferedTransformation :: ChannelFlush(std :: string const&,bool,int,bool)”,引自:

 vtable for CryptoPP::SimpleProxyFilter in MYCLASSBBB.o
 vtable for CryptoPP::Bufferless<CryptoPP::Filter> in MYCLASSBBB.o
     

“CryptoPP :: Filter :: CopyRangeTo2(CryptoPP :: BufferedTransformation&amp ;, unsigned long long&amp ;, unsigned long long,std :: string const&amp; bool)const”,引自:

 vtable for CryptoPP::Base64Decoder in MYCLASSBBB.o
 vtable for CryptoPP::Unflushable<CryptoPP::Filter> in MYCLASSBBB.o
 vtable for CryptoPP::SimpleProxyFilter in MYCLASSBBB.o
 vtable for CryptoPP::Bufferless<CryptoPP::Filter> in MYCLASSBBB.o
     

“CryptoPP :: Filter :: TransferTo2(CryptoPP :: BufferedTransformation&amp ;, unsigned long long&amp;,std :: string const&amp;,bool)”,引自:

 vtable for CryptoPP::Base64Decoder in MYCLASSBBB.o
 vtable for CryptoPP::Unflushable<CryptoPP::Filter> in MYCLASSBBB.o
 vtable for CryptoPP::SimpleProxyFilter in MYCLASSBBB.o
 vtable for CryptoPP::Bufferless<CryptoPP::Filter> in MYCLASSBBB.o
     

“CryptoPP :: BufferedTransformation :: ChannelPut2(std :: string const&amp ;, unsigned char const *,unsigned long,int,bool)”,引自:

 vtable for CryptoPP::Base64Decoder in MYCLASSBBB.o
 vtable for CryptoPP::Unflushable<CryptoPP::Filter> in MYCLASSBBB.o
 vtable for CryptoPP::SimpleProxyFilter in MYCLASSBBB.o
 vtable for CryptoPP::Bufferless<CryptoPP::Filter> in MYCLASSBBB.o
     

“CryptoPP :: BufferedTransformation :: ChannelCreatePutSpace(std :: string const&amp;,unsigned long&amp;)”,引自:

 vtable for CryptoPP::Base64Decoder in MYCLASSBBB.o
 vtable for CryptoPP::Unflushable<CryptoPP::Filter> in MYCLASSBBB.o
 vtable for CryptoPP::SimpleProxyFilter in MYCLASSBBB.o
 vtable for CryptoPP::Bufferless<CryptoPP::Filter> in MYCLASSBBB.o
     

“CryptoPP :: BufferedTransformation :: ChannelPutModifiable2(std :: string const&amp ;, unsigned char *,unsigned long,int,bool)”,引自:

 vtable for CryptoPP::Base64Decoder in MYCLASSBBB.o
 vtable for CryptoPP::Unflushable<CryptoPP::Filter> in MYCLASSBBB.o
 vtable for CryptoPP::SimpleProxyFilter in MYCLASSBBB.o
 vtable for CryptoPP::Bufferless<CryptoPP::Filter> in MYCLASSBBB.o
     

“CryptoPP :: BufferedTransformation :: ChannelMessageSeriesEnd(std :: string const&amp;,int,bool)”,引自:

 vtable for CryptoPP::Base64Decoder in MYCLASSBBB.o
 vtable for CryptoPP::Unflushable<CryptoPP::Filter> in MYCLASSBBB.o
 vtable for CryptoPP::SimpleProxyFilter in MYCLASSBBB.o
 vtable for CryptoPP::Bufferless<CryptoPP::Filter> in MYCLASSBBB.o
     

“CryptoPP :: BufferedTransformation :: SetRetrievalChannel(std :: string const&amp;)”,引自:

 vtable for CryptoPP::Base64Decoder in MYCLASSBBB.o
 vtable for CryptoPP::Unflushable<CryptoPP::Filter> in MYCLASSBBB.o
 vtable for CryptoPP::SimpleProxyFilter in MYCLASSBBB.o
 vtable for CryptoPP::Bufferless<CryptoPP::Filter> in MYCLASSBBB.o
     

“CryptoPP :: StringSinkTemplate :: StringSinkTemplate(std :: string&amp;)”,引自:

 encryptString(std::string const&) in MYCLASSBBB.o
 decryptString(std::string const&, int) in MYCLASSBBB.o
 MYCLASSAAA::setDeviceId() in MYCLASSAAA.o
 MYCLASSAAA::getSignature() in MYCLASSAAA.o
     

ld:找不到架构arm64的符号   clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

MYCLASSAAA和MYCLASSBBB都是使用cryptopp lib的所有课程。

我会尝试自己构建lib,但我认为可能会发生同样的错误。我想做什么?

和项目设置 - 我没有在“Apple LLVM 6.0 - 语言”中将“Compile Sources As”更改为Objective-C ++,我只是将其设置为“根据文件类型”。它必须是客观的c ++?当我改变它时,它在另一个来源中出现太多错误。因为它是cocos2d-x(0.12.0 / c ++项目)的遗留项目......

我希望你的帮助。感谢。

2 个答案:

答案 0 :(得分:0)

  

我该如何解决?

简短回答:下载脚本的新副本后运行. ./setenv-ios.sh x86_64。默认情况下,setenv-ios.sh使用i386作为模拟器,它不支持x86_64。该脚本现在响应x86_64,因此获取新副本。

基于@ rmaddy在Does Xcode 6 Simulator use x86_64?的回答,在某些情况下,Xcode 6 / iOS 8 SDK似乎使用x86_64作为模拟器。

上传了新版setenv-ios.sh。它将使用. ./setenv-ios.sh x86_64 SDK作为编译器选项来回复iPhoneSimulator.platform

在{* 3}}的Crpyto ++ wiki页面上添加了一个新的部分。请参阅模拟器,ARM64和x86_64 部分。

答案 1 :(得分:0)

我解决了这个问题 - 简而言之,在构建libcryptopp时,必须使用-stdlib = libstdc ++标志(在GNUMAKEFILE中为CXXFLAGS)构建。

因为我的项目是遗留的cocos2d-x项目,所以标准库被设置为libstdc ++。

更多信息是here。杰弗里非常详细地回答了我。