Неопределенные символы в 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++
Тогда вы можете построить его самостоятельно. Вот шаги:
- Скачайте и распакуйте Crypto++ с сайта
- Скачать и распаковать
cryptopp-mobile.zip
, Распакуйте его прямо поверх исходных файлов Crypto++ - Откройте новый
GNUmakefile
найти правило iOS, выполнив поиск блока, начинающегося сIS_IOS
- Измените эту строку в
IS_IOS
блок:CXXFLAGS += -stdlib=libc++
, Измените это наCXXFLAGS += -stdlib=libstdc++
- Сделать кросс-компиляцию...
-----
Я скачал 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?,