【问题标题】:Undefined symbols in Crypto++/iOS 64-bit projectCrypto++/iOS 64 位项目中的未定义符号
【发布时间】:2015-04-03 09:49:22
【问题描述】:

我尝试使用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 库的类。 它使用 cryptlib.h、modes.h、filters.h、aes.h、base64.h、md5.h、hex.h。

我什至尝试自己构建库,但发生了同样的错误。我该怎么办?

我希望你的帮助。谢谢。


添加 xcode cmd

Ld /Users/USERNAME/Library/Developer/Xcode/DerivedData/PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee/Build/Products/Release-iphoneos/PROJECT_NAME.app/PROJECT_NAME 正常 arm64 cd /用户/用户名/桌面/开发/Office_Projects/PROJECTROOT/root 导出 IPHONEOS_DEPLOYMENT_TARGET=5.1.1 导出 PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin: /usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8。 1.sdk -L/Users/USERNAME/Library/Developer/Xcode/DerivedData/PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee/Build/Products/Release-iphoneos -L/Users/USERNAME/Desktop/Development/Office_Projects/PROJECTROOT/root/PROJECT_NAME/libs/ cocos2dx/platform/third_party/ios/libraries -L/Users/USERNAME/Desktop/Development/Office_Projects/PROJECTROOT/root/PROJECT_NAME/libs/EEAF-SDK7.0(i386,armv7,armv7s,arm64) -L/Users/USERNAME /Desktop/Development/Office_Projects/PROJECTROOT/root/PROJECT_NAME/libs/boost_1_57/ios -L/Users/USERNAME/Desktop/Development/Office_Projects/PROJECTROOT/root/PROJECT_NAME/Classes/cryptopp/lib -LPROJECT_NAME/cocos2dx/platform/third_party /ios/libraries -LPROJECT_NAME/EEAF-SDK7.0(i386,armv7,armv7s,arm64) -F/Users/USERNAME/Library/Developer/Xcode/DerivedData/PROJECT_NAME-aknkujy aqvqjswbhspmawywtyqee/Build/Products/Release-iphoneos -F/Users/USERNAME/Desktop/Development/Office_Projects/PROJECTROOT/root/PROJECT_NAME/libs -filelist /Users/USERNAME/Library/Developer/Xcode/DerivedData/PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee/Build/中间体/PROJECT_NAME.build/Release-iphoneos/PROJECT_NAME.build/Objects-normal/arm64/PROJECT_NAME.LinkFileList -dead_strip -lxml2 -lz -ObjC -lcryptopp -fobjc-link-runtime -miphoneos-version-min=5.1.1 - lc++ /Users/USERNAME/Desktop/Development/Office_Projects/PROJECTROOT/root/PROJECT_NAME/libs/boost_1_57/ios/boost.a -framework UIKit -framework CoreTelephony -lEEAF -framework FacebookSDK -framework AddressBook -framework AddressBookUI -framework AudioToolbox -framework AVFoundation -framework CFNetwork -framework CoreGraphics -framework CoreLocation -framework CoreMedia -framework CoreText -framework Foundation -framework ImageIO -framework MediaPlayer -framework MobileCoreServices -framework OpenAL -framework OpenGLES -framework Quart zCore -framework Security -framework SystemConfiguration -lsqlite3.0 -framework StoreKit -lcurl -Xlinker -dependency_info -Xlinker /Users/USERNAME/Library/Developer/Xcode/DerivedData/PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee/Build/Intermediates/PROJECT_NAME.build/Release-iphoneos /PROJECT_NAME.build/Objects-normal/arm64/PROJECT_NAME_dependency_info.dat -o /Users/USERNAME/Library/Developer/Xcode/DerivedData/PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee/Build/Products/Release-iphoneos/PROJECT_NAME.app/PROJECT_NAME

和“CRYPTOPP::~.o 的 vtable”总是会发生。附上通知:

注意:缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义。

【问题讨论】:

  • “我什至尝试自己构建库” - 而您如何做到了?搜索您的标题文本 逐字 导致了几个潜在原因,其中一个显示为 some promise
  • @WhozCraig 好吧,我用 here 中的“build-for-ios.sh”构建了那个库,/setenv-ios.sh 更新为 this
  • @Jaguar 什么是 Build setting > 在 Architectures 下??

标签: c++ ios xcode cocos2d-x crypto++


【解决方案1】:
Undefined symbols for architecture arm64: "CryptoPP::BufferedTransformation::ChannelFlush(std::string const&, bool, int, bool)", referenced from:

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

认为使用libc++,这是LLVM的C++标准库。我认为这是因为我没有看到-stdlib=libc++(但我不记得是否直接传递给ld)。

符号在github's prebuilt cryptopp 中定义(这是我的 github,顺便说一句)。以下是验证方法。

首先,从fat库中提取arm64库:

$ xcrun -sdk iphoneos lipo libcryptopp.a -thin arm64 -output libcryptopp-arm64.a
$ ls
libcryptopp-arm64.a libcryptopp.a

接下来,使用nm 转储全局符号,并使用c++filt 进行分解:

$ nm -g libcryptopp-arm64.a | c++filt | grep BufferedTransformation::ChannelFlush | grep " T "
0000000000002110 T CryptoPP::BufferedTransformation::ChannelFlush(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, int, bool)

capitol T 表示您正在搜索已定义和导出的符号。较低的t 表示其已定义未导出 - 即私有。 Capitol U 表示未定义。

__1libc++ (LLVM) 用来与 libstdc++ (GNU) 区分开来的。 std::__1::basic_string&lt;char, std::__1::char_traits&lt;char&gt;, std::__1::allocator&lt;char&gt; &gt;string,因此可以重写为:

CryptoPP::BufferedTransformation::ChannelFlush(std::__1::string const&, bool, int, bool)

如果这个库是针对libstdc++ (GNU) 构建的,那么库中的符号将是:

CryptoPP::BufferedTransformation::ChannelFlush(std:::string const&, bool, int, bool)

我们可以重复第二个问题孩子,它遵循相同的模式(libc++,而不是libstdc++):

$ nm -g libcryptopp-arm64.a | c++filt | grep CryptoPP::Filter::CopyRangeTo2 | grep " T "
00000000000001c4 T CryptoPP::Filter::CopyRangeTo2(CryptoPP::BufferedTransformation&, unsigned long long&, unsigned long long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) const

这可以改写为:

CryptoPP::Filter::CopyRangeTo2(CryptoPP::BufferedTransformation&, unsigned long long&, unsigned long long, std::__1::string const&, bool) const

-----

如果你需要 GNU 的 libstdc++,那么你可以自己构建它。步骤如下:

  1. 从网站下载并解压 Crypto++
  2. 下载并解压cryptopp-mobile.zip。在 Crypto++ 源文件上方解压缩它
  3. 打开新的GNUmakefile,通过搜索以IS_IOS开头的块找到iOS规则
  4. IS_IOS 块中更改此行:CXXFLAGS += -stdlib=libc++。将其更改为CXXFLAGS += -stdlib=libstdc++
  5. 进行交叉编译...

-----

我下载了 Cocos2D-x 并尝试查看它的配置(我不是 Cmake 人,所以我可能对以下内容有误)。它在CmakeList.txt 中有以下内容:

if(MSVC)
  ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS
                  -wd4251 -wd4244 -wd4334 -wd4005 -wd4820 -wd4710
                  -wd4514 -wd4056 -wd4996 -wd4099)
else()
  set(CMAKE_C_FLAGS_DEBUG "-g -Wall -DCOCOS2D_DEBUG=1")
  set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-exceptions -std=c99")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -std=c++11 -Wno-deprecated-declarations -Wno-reorder")
  if(CLANG)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
  endif()
endif(MSVC)

如果 Cmake 正在做我怀疑的事情,那么它使用 LLVM 的 libc++。但它也使用-std=c++11,而GitHub项目没有使用它。但我不确定-std=c++11 在这里有什么不同。

只是自行车脱落,但这是一个不好的信号:_SCL_SECURE_NO_WARNINGS。如果他们明目张胆地这样做,那么他们可能有不同程度的坏和破碎。 (只是我在审计软件方面的经验)。


如果有兴趣,__1 是一个用于版本控制的内联命名空间。请参阅What are inline namespaces for?Where does the __1 symbol come from when using LLVM's libc++?

【讨论】:

  • 非常感谢!实际上我用your help in mailing archive 解决了这个问题!它工作得很好,感谢您的帮助。祝你有美好的一天!
猜你喜欢
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 2011-12-18
  • 1970-01-01
相关资源
最近更新 更多