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

Я пытался собрать с помощью готового crypttopp 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 &, длинная длинная без знака и длинная длинная без знака, 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: error: сбой команды компоновщика с кодом выхода 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 нормальный arm64 кд /Users/USERNAME/Desktop/ Разработка /Office_Projects/PROJECTROOT/ корень экспорт 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/ Платформы / iPhoneOS.platform / Разработчик /SDKs/iPhoneOS8.1.sdk -L/ Пользователи / USERNAME / Библиотека / Разработчик / Xcode / DerivedData / PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee / Build / Продукты /Release-iphoneos -L/ Пользователи / USERNAME / Desktop Разработка /Office_Projects/PROJECTROOT/root/PROJECT_NAME/libs/cocos2dx/ платформа /third_party/ios/library -L / Пользователи / USERNAME / Рабочий стол / Разработка /Office_Projects/PROJECTROOT/root/PROJECT_NAME/libs/EEAF-SDK7.0(i386,armv7,armv7s,arm64) -L/ Пользователи / USERNAME / Рабочий стол / Разработка /Office_Projects/PROJECTROOT/root/PROJECT_NAME/libs/boost_1_57/ios -L/ Пользователи / ИМЯ ПОЛЬЗОВАТЕЛЯ / Рабочий стол / Разработка /Office_Projects/PROJECTROOT/ root / PROJECT_NAME / Классы /cryptopp/lib -LPROJECT_NAME/cocos2dx/platform/third_party/ios/ библиотеки -LPROJECT_NAME/EEAF-SDK7.0(i386,armv7,armv7, armv7, arm) -F / Users / ИМЯ ПОЛЬЗОВАТЕЛЯ / Библиотека / Разработчик / Xcode / DerivedData / PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee / Build / Продукты /Release-iphoneos -F/ Пользователи / USERNAME / Рабочий стол / Разработка /Office_Projects/PROJECTROOT/ root / PROJECT_AME Пользователи / ИМЯ ПОЛЬЗОВАТЕЛЯ / Библиотека / Разработчик /Xcode/DerivedData/PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee/Build/Intermediates/PROJECT_NAME.build/Release-iphoneos/PROJECT_NAME.build/Objects-normal-change-rip-arm-set-arm64/PROJECT_L64.jlx.jl.jl.jl.RD lcryptopp -fobjc-link-runtime -miphoneos-version-min=5.1.1 -lC++ / Пользователи / ИМЯ ПОЛЬЗОВАТЕЛЯ / Рабочий стол / Разработка /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 -framework Foundation -framework ImageIO -framework MediaPlayer -framework MobileCoreServices -framework OpenAL -рамка OpenGLES -framework QuartzCore -framework Security -создание системной конфигурации /Xcode/DerivedData/PROJECT_NAME-aknkujyaqvqjswbhspmawywtyqee/Build/Intermediates/PROJECT_NAME.build/Release-iphoneos/PROJECT_NAME.build/Objects-normal/armcode /arm_ND_ND_ND_DIFD_DID_DIFI_ID_ID_ID_ID_ID_ID_D_D_D_DID_D_D_D_D_D_K_D_K_D_D_K_D_D_K_K_D_D_D_K_S_D_D_D_K_K_D_D_D_K_D__D_D_K_D_D__D_S_K_RU_D_D_D_D_D_K__D__D_D_D_D_D_D_S_K_SID -aknkujyaqvqjswbhspmawywtyqee / Build / Продукция / Релизы-iphoneos / PROJECT_NAME.app / PROJECT_NAME

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

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

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++, которая является стандартной библиотекой C++ от LLVM. Я думаю, потому что я не вижу -stdlib=libc++ (но я не помню, если это было передано ld напрямую).

Символ определен в готовом криптопе github (это мой github, кстати). Вот как это проверить.

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

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

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

__1 это что libc++ (LLVM) использует для дифференциации от libstdc++ (ГНУ). 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

-----

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

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

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


Если интересно, то __1 это встроенное пространство имен, используемое для управления версиями. См. Для чего нужны встроенные пространства имен? и откуда берется символ __1 при использовании libC++ от LLVM?,

Другие вопросы по тегам