Crypto ++ / iOS 64位项目中的未定义符号 [英] Undefined symbols in Crypto++/iOS 64-bit project

查看:830
本文介绍了Crypto ++ / iOS 64位项目中的未定义符号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用 github的预建cryptopp 制作,但无法使用,也。它发生的错误如下:


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

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

CryptoPP :: Filter :: CopyRangeTo2(CryptoPP :: BufferedTransformation& unsigned long用于CryptoPP的vtable:用于CryptoPP的vtable:用于CryptoPP的vtable:用于CryptoPP的vtable: :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>在MYCLASSBBB.o

CryptoPP :: Filter :: TransferTo2(CryptoPP :: BufferedTransformation& unsigned long引用自:

  vtable为MYCLASSBBB中的CryptoPP :: Base64Decoder。 o 
vtable for CryptoPP :: Unflushable< CryptoPP :: Filter> in MYCLASSBBB.o
vtable for CryptoPP :: SimpleProxyFilter in MYCLASSBBB.o
vtable for CryptoPP :: Bufferless< CryptoPP :: Filter>在MYCLASSBBB.o

CryptoPP :: BufferedTransformation :: ChannelPut2(std :: string const& unsigned引用自:

  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>在MYCLASSBBB.o

CryptoPP :: BufferedTransformation :: ChannelCreatePutSpace(std :: string const& unsigned引用自:

  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>在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>在MYCLASSBBB.o

CryptoPP :: BufferedTransformation :: ChannelMessageSeriesEnd(std :: string const& int ,bool),引用自:

  vtable为CryptoPP :: Base64Decoder在MYCLASSBBB.o 
vtable为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在MYCLASSAAA.o
中的MYCLASSAAA :: getSignature()在MYCLASSAAA.o
中的MYCLASSBB.o
MYCLASSAAA :: setDeviceId pre>

ld:没有为架构找到符号arm64
clang:error:linker命令失败,退出代码1(使用-v查看调用)


MYCLASSAAA和MYCLASSBBB都是使用cryptopp lib的类。
它使用cryptlib.h,modes.h,filters.h,aes.h,base64.h,md5.h,hex.h。



I甚至试图自己构建lib,但我同样的错误发生。我该怎么办?



我希望你的帮助。感谢。






添加xcode cmd


Ld /Users/USERNAME/Library/Developer/Xcode/DerivedData/PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee/Build/Products/Release-iphoneos/PROJECT_NAME.app/PROJECT_NAME normal arm64
cd / Users / USERNAME / Desktop / Development / Office_Projects / PROJECTROOT / root
export IPHONEOS_DEPLOYMENT_TARGET = 5.1.1
export 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 /开发/ 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 /用户/用户名/桌面/开发/ Office_Projects / PROJECTROOT /根/ PROJECT_NAME /班/ cryptopp / lib中-LPROJECT_NAME / cocos2dx /平台/ THIRD_PARTY / IOS /库-LPROJECT_NAME / EEAF-SDK7.0平台(i386,ARMv7的,armv7s ,arm64)-F /用户/用户名/库/开发商/ Xcode中/ DerivedData / PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee /建设/产品/释放的iPhoneOS -F /用户/用户名/桌面/开发/ Office_Projects / PROJECTROOT /根/ PROJECT_NAME /库 - 文件清单/Users/USERNAME/Library/Developer/Xcode/DerivedData/PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee/Build/Intermediates/PROJECT_NAME.build/Release-iphoneos/PROJECT_NAME.build/Objects-normal/arm64/PROJECT_NAME.LinkFileList -dead_strip -lxml2 -lz - ObjC -lcryptopp -fobjc链接运行时-miphoneos版本分钟= 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通讯簿-framework AddressBookUI -framework AudioToolbox -framework AVFoundation -framework CFNetwork的-framework CoreGraphics中-framework CoreLocation -framework CoreMedia -framework CoreText -framework基金会-framework的ImageIO -framework MediaPlayer的-framework MobileCoreServices -framework的OpenAL -framework OpenGLES -framework QuartzCore -framework安全-framework SystemConfiguration -lsqlite3.0 -framework StoreKit -lcurl -Xlinker -dependency_info -Xlinker /用户/用户名/库/开发商/ Xcode中/ DerivedData / PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee /建设/中间体/ PROJECT_NAME。建立/释放的iPhoneOS / PROJECT_NAME.build /对象正常/ 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


和vtable for CRYPTOPP ::〜.o。通知:


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



解决方案

 架构arm64的未定义符号:CryptoPP :: BufferedTransformation :: ChannelFlush(标准::字符串常量和放大器;,BOOL,INT,BOOL),引用自:

在MYCLASSBBB.o
虚函数表的CryptoPP ::无缓冲<虚函数表的CryptoPP :: SimpleProxyFilter; CryptoPP :: Filter>在MYCLASSBBB.o

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



符号定义在 github的预构建cryptopp (这是我的github,btw)。



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

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

接下来,使用 nm 转储全局符号,并使用 c ++ filt to demangle:

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

国会 code>表示您要搜索定义和导出的符号。下 t 表示其定义的,但未导出 - 即为私有。 Capitol U 表示其未定义。



__ 1 libc ++ (LLVM)用于区分 libstdc ++ (GNU)。 std :: __ 1 :: basic_string< char,std :: __ 1 :: char_traits< char>,std :: __ 1 :: allocator< char> > 字符串,因此可以重写为:

  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 | grepT
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

  4. IS_IOS 区块中更改此行: CXXFLAGS + = -stdlib = libc ++ 。将其更改为 CXXFLAGS + = -stdlib = ++的libstdc

  5. 请交叉编译...



-----



我下载的Cocos2D-X和想看看它的配置(我不是一个Cmake的家伙,所以我可能错了以下)。它在 CmakeList.txt 中有以下内容:

  if 
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS
-wd4251 -wd4244 -wd4334 -wd4005 -wd4820 -wd4710
-wd4514 -wd4056 -wd4996 -wd4099)
,否则()
集(CMAKE_C_FLAGS_DEBUG-g -Wall -DCOCOS2D_DEBUG = 1)
组(CMAKE_CXX_FLAGS_DEBUG $ {} CMAKE_C_FLAGS_DEBUG)
组(CMAKE_C_FLAGS$ {} CMAKE_C_FLAGS -fno-例外-std = C99)
组(CMAKE_CXX_FLAGS$ {} CMAKE_CXX_FLAGS -fno-例外-std = C ++ 11 -Wno弃用-声明-Wno-重新排序)
如果(CLANG)
组(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 是用于版本控制的内联命名空间。请参见什么是内联命名空间?在哪里__1符号来自使用LLVM的libc ++?


I tried to build with github's prebuilt cryptopp but it doesn't work, too. it occur errors like below:

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

"CryptoPP::Filter::CopyRangeTo2(CryptoPP::BufferedTransformation&, unsigned long long&, unsigned long long, std::string const&, bool) const", referenced from:

 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)", referenced from:

 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)", referenced from:

 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&)", referenced from:

 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)", referenced from:

 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)", referenced from:

 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&)", referenced from:

 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&)", referenced from:

 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: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

the MYCLASSAAA and MYCLASSBBB are all of classes what using cryptopp lib. it using cryptlib.h, modes.h, filters.h, aes.h, base64.h, md5.h, hex.h.

I even tried to build the lib myself, but I it same errors happen. what should I do?

I hope your help. thanks.


add the xcode cmd

Ld /Users/USERNAME/Library/Developer/Xcode/DerivedData/PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee/Build/Products/Release-iphoneos/PROJECT_NAME.app/PROJECT_NAME normal arm64 cd /Users/USERNAME/Desktop/Development/Office_Projects/PROJECTROOT/root export IPHONEOS_DEPLOYMENT_TARGET=5.1.1 export 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-aknkujyaqvqjswbhspmawywtyqee/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/Intermediates/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 QuartzCore -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

and "vtable for CRYPTOPP::~.o" always happen. with a notice :

NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.

解决方案

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

I think you are not using libc++, which is LLVM's C++ standard library. I think that because I don't see a -stdlib=libc++ (but I don't recall if that's passed to ld directly).

The symbol is defined in the github's prebuilt cryptopp (that's my github, btw). Here's how to verify.

First, extract the arm64 library from the fat library:

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

Next, use nm to dump global symbols, and use c++filt to demangle:

$ 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)

The capitol T means you are searching for symbols that are defined and exported. Lower t means its defined but not exported - i.e., private. Capitol U means its undefined.

The __1 is what libc++ (LLVM) uses to differentiate from libstdc++ (GNU). std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > is a string, so that could be rewritten as:

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

If this library was built against libstdc++ (GNU), then the symbol from the library would be:

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

We can repeat for the second problem child, and it follows the same pattern (libc++, and not 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

This can be rewritten as:

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

-----

IF you need GNU's libstdc++, then you can build it yourself. Here are the steps:

  1. Download and unpack Crypto++ from the website
  2. Download and unpack cryptopp-mobile.zip. Unpack it right over top the Crypto++ source files
  3. Open the new GNUmakefile, find the iOS rule by searching for the block that begins with IS_IOS
  4. Change this line in the IS_IOS block: CXXFLAGS += -stdlib=libc++. Change it to CXXFLAGS += -stdlib=libstdc++
  5. Do the cross compile...

-----

I downloaded Cocos2D-x and tried to look at its configuration (I'm not a Cmake guy, so I could be wrong with what follows). It has the following in 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)

If Cmake is doing what I suspect, then its using LLVM's libc++. But its also using -std=c++11, and the GitHub project is not using it. But I'm not sure -std=c++11 makes a difference here.

Just bike shedding, but this is a bad sign: _SCL_SECURE_NO_WARNINGS. If they are blatantly doing that, then they probably have various degrees of of badness and brokenness. (Just my experience with auditing software).


If interested, the __1 is an inline namespace used for versioning. See What are inline namespaces for? and Where does the __1 symbol come from when using LLVM's libc++?.

这篇关于Crypto ++ / iOS 64位项目中的未定义符号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆