【问题标题】:Undefined symbols for architecture x86_64 when building for ARM64为 ARM64 构建时架构 x86_64 的未定义符号
【发布时间】:2015-03-18 14:08:31
【问题描述】:

我构建了用于 ios 应用程序的 cryptopp 库。但不工作,只告诉我

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

不断……

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

我该如何解决这个问题?

ld:警告:忽略文件 [路径]/libcryptopp.a,缺少必需的 文件 [path]/libcryptopp.a 中的架构 x86_64(4 slices)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&, unsigned long long&, unsigned long long, std::string const&, 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&, unsigned long long&, std::string const&, 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&, 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&, unsigned long&)”,引用自:

 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&, 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&, 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&)”,引用自:

 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&)”,引用自:

 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 库的类。

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

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

我希望你的帮助。谢谢。

【问题讨论】:

  • 在模拟器和设备上运行时是否都出现过?
  • @user523234 ya 出现在任何目标中
  • “架构 x86_64 的未定义符号” - 听起来您的应用程序是为 x86_64 构建的,而不是 iOS 架构(如 armv7 或 arm64)。 lipo 为您的图书馆报告了什么:xcrun -sdk iphoneos lipo -info libcryptopp.a
  • @jww iPhone 6 模拟器正在使用 x86_64。我使用正确的设置重新构建了该库,并且忽略了文件警告消失了。但它仍然告诉我“架构 x86_64 的未定义符号”。
  • @jww 我的库是 [ 胖文件中的体系结构:libcryptopp.a 是:x86_64 i386 ]

标签: ios ios-simulator crypto++


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我该如何解决这个问题?

    简短回答:下载脚本的新副本后运行. ./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 已上传。它将通过使用-arch x86_64 作为编译器选项选择iPhoneSimulator.platform SDK 来响应. ./setenv-ios.sh x86_64

    iOS (Command Line) 的 Crpyto++ wiki 页面上添加了一个新的部分。请参阅模拟器、ARM64 和 x86_64 部分。

    【讨论】:

    • 感谢您编辑 shell 脚本。我会再试一次,并会回复这个答案。很抱歉为时已晚检查此答案。
    猜你喜欢
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    相关资源
    最近更新 更多