Неопределенные символы в 64-битном проекте Crypto ++ / iOS

Я попытался построить с помощью криптоппа github, но он тоже не работает. возникают ошибки, как показано ниже:

Неопределенные символы для архитектуры 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 lib. он использует cryptlib.h, modes.h, filters.h, aes.h, base64.h, md5.h, hex.h.

Я даже пытался сам построить 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 / корневой экспорт IPHONEOS_DEPLOYMENT_TARGET = 5.1.1 export PATH = "/ Applications / Xcode.app / Содержание / Разработчик / Платформы / iPhoneOS.platform / Разработчик / 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/ Платформы / iPhoneOS.platform / Разработчик / SDK / iPhoneOS8.1.sdk -L / Пользователи / USERNAME / Библиотека / Разработчик / Xcode / DerivedData / PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee / Build / Products / Release-iphoneos -L / Пользователи / USERNAME / Desktop / Разработка / Office_Projects / PROJECTROOT / root / PROJECT_NAME / libs / cocos2dx / platform / third_party / ios / libraries -L / Пользователи / USERNAME / Desktop / Development / Office_Project s / PROJECTROOT / root / PROJECT_NAME / libs / EEAF-SDK7.0 (i386, armv7, armv7s, arm64) -L / Пользователи / USERNAME / Desktop / Development / Office_Projects / PROJECTROOT / root / PROJECT_NAME / libs / boost_1_57 / ios -L / Пользователи / USERNAME / Desktop / Development / Office_Projects / PROJECTROOT / root / PROJECT_NAME / Классы / cryptopp / lib -LPROJECT_NAME / cocos2dx / platform / third_party / ios / libraries -LPROJECT_NAME / EEAF-SDK7.0 (i386, armv7, armv7s, arm64 ) -F / Пользователи / USERNAME / Библиотека / Разработчик / Xcode / DerivedData / PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee / Build / Products / Release-iphoneos -F / Пользователи / USERNAME / Desktop / Development / Office_Projects / PROJECTROOT / root / PROJECT_NAME / libs -файл / Пользователи / USERNAME / Библиотека / Разработчик / 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 ++ / Пользователи / 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 / Библиотека / Разработчик /Xcode/DerivedData/PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee/Build/Intermediates/PROJECT_NAME.build/Release-iphoneos/PROJECT_NAME.build/Objects-normal/arm64/PROJECT_NAME_dependency_info.dat -o / Пользователи / USERNAME / Библиотека / Разработчик / Xcode / DerivedData / PROJECT_NAME -aknkujyaqvqjswbhspmawywtyqee / Build / Продукция / Релизы-iphoneos / PROJECT_NAME.app / PROJECT_NAME

и «vtable для CRYPTOPP :: ~ .o» всегда происходит. с уведомлением:

ПРИМЕЧАНИЕ. Отсутствующая виртуальная таблица обычно означает, что первая функция не-встроенного виртуального члена не имеет определения.

  • Неопределенные символы для архитектуры x86_64 при построении для ARM64
  • One Solution collect form web for “Неопределенные символы в 64-битном проекте Crypto ++ / iOS”

     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 (это мой github, кстати). Вот как проверить.

    Сначала извлеките библиотеку arm64 из библиотеки жира:

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

    Затем используйте nm для c++filt глобальных символов и используйте c++filt для 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) 

    Капитель T означает, что вы ищете символы, которые определены и экспортированы. Нижний t означает его определенный, но не экспортируемый, т. Е. Частный. Capitol U означает, что он не определен.

    __1 – это то, что использует libc++ (LLVM) для отличия от libstdc++ (GNU). std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > – это 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 

    —–

    ЕСЛИ вам нужен libstdc++ GNU, тогда вы можете его самостоятельно создать. Вот шаги:

    1. Загрузите и распакуйте Crypto ++ с веб-сайта
    2. Загрузите и распакуйте cryptopp-mobile.zip . Распакуйте его прямо поверх исходных файлов Crypto ++
    3. Откройте новый GNUmakefile , найдите правило iOS, IS_IOS поиск блока, который начинается с IS_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 делает то, что я подозреваю, тогда он использует libc++ LLVM. Но он также использует -std=c++11 , а проект GitHub не использует его. Но я не уверен, что -std=c++11 имеет значение здесь.

    Просто выпадение байка, но это плохой знак: _SCL_SECURE_NO_WARNINGS . Если они вопиюще делают это, то они, вероятно, имеют разную степень плохости и расколотости. (Только мой опыт работы с программным обеспечением для аудита).


    Если это интересно, __1 является встроенным пространством имен, используемым для управления версиями. См. Что такое встроенные пространства имен? и Откуда появляется символ __1 при использовании libc ++ LLVM? ,

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.