2015-01-06 10 views
1

Я пытаюсь импортировать и использовать проверенный объектный модуль OpenSSL FIPS в моем проекте iOS. Когда я строю проекта я получаю эту ошибку, говоря:Неопределенная архитектура для armv7 - импорт библиотек C

Undefined symbols for architecture armv7: 
"std::string::clear()", referenced from: 
    +[CryptoUtilities getSeed:::] in CryptoUtilities.o 
    +[CryptoUtilities getKey:::] in CryptoUtilities.o 
"___cxa_pure_virtual", referenced from: 
    vtable for WBXML::CWBXMLParser in CWBXMLParser.o 
"std::string::substr(unsigned long, unsigned long) const", referenced from: 
    WBXML::CWBXMLParser::LoadWBXMLHeader(std::string const&, unsigned long, unsigned long&) in CWBXMLParser.o 
    WBXML::CWBXMLParser::LoadTagContents(WBXML::CTag*, std::string const&, unsigned long, unsigned long&, unsigned short&, bool&) in CWBXMLParser.o 
    +[CryptoUtilities getKey:::] in CryptoUtilities.o 
"operator delete(void*)", referenced from: 
    __gnu_cxx::new_allocator<WBXML::CTag>::deallocate(WBXML::CTag*, unsigned long) in CTag.o 
    __gnu_cxx::new_allocator<int>::deallocate(int*, unsigned long) in CryptoUtilities.o 

    // This goes for some more functions and then 
ld: symbol(s) not found for architecture armv7 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Я знаю, что этот вопрос был задан и ответил на here. Я пробовал все упомянутые решения, но я не могу исправить эту проблему.

Вот что я пытаюсь решить эту проблему.

  • Я добавил файлы libs и canister в разделе связанных фреймворков и библиотек.

  • Поскольку это lib, у меня нет никаких файлов .m.

  • Я попытался сменить компилятор C++ на Compiler Default, LLVM, GNU, и никто из них не работал.

  • Я пробовал добавить -ObjC в другие флаги компоновщика.

  • Я попробовал extern C при включении файлов заголовков. В определении файлов заголовков также правильно используется extern C.

Update:

Я правильно установить параметры компилятора, как указано ниже.

enter image description here

Кроме того, если это будет любая помощь в выяснении этой ошибки. Именно при запуске этого скрипта на этапе сценария я получаю упомянутые ошибки.

https://docs.google.com/document/d/1YEebn2p8HKhc7lxUWa3xMHXWt1cELXLm3AoKElbEyuU/edit?usp=sharing

Пожалуйста, помогите мне.

Update2:

Выход xcrun -sdk iphoneos льего -info CryptoUtilities.o является
Обезжиренного файл: CryptoUtilities.o является архитектурой: ARMv7

Более подробной информации об ошибках: https://docs.google.com/document/d/1CqSa_tAsQP1JY_IxvXLDyYyQUI0iebV_REiCquwDXyk/edit?usp=sharing

Просьба помочь. Я занимаю эту должность около месяца.

+0

'__gnu_cxx :: ...' из среды выполнения GNU C++ ('-stdlib = libstdC++'). Вы должны скомпилировать WBXML со средой выполнения LLVM C++ ('-stdlib = libC++'). Если библиотеки были смешаны/сопоставлены противоположным образом, тогда вы будете получать ошибки об отсутствии '__1 :: ...' – jww

+0

Также добавьте вывод 'xcrun -sdk iphoneos lipo -info CryptoUtilities.o'. Но похоже, что вы не используете правильные сроки выполнения C++. – jww

+0

@jww Я изменил диалект и библиотеку на (по умолчанию компилятора, по умолчанию компилятора), а также на libC++. Это дало мне ту же ошибку. Также добавлен вывод cmd выше. – Theguy

ответ

0
"std::string::clear()", referenced from: 
    +[CryptoUtilities getSeed:::] in CryptoUtilities.o 
    +[CryptoUtilities getKey:::] in CryptoUtilities.o 
"___cxa_pure_virtual", referenced from: 
    vtable for WBXML::CWBXMLParser in CWBXMLParser.o 
"std::string::substr(unsigned long, unsigned long) const", referenced from: 
    WBXML::CWBXMLParser::LoadWBXMLHeader(std::string const&, unsigned long, unsigned long&) in CWBXMLParser.o 
    WBXML::CWBXMLParser::LoadTagContents(WBXML::CTag*, std::string const&, unsigned long, unsigned long&, unsigned short&, bool&) in CWBXMLParser.o 
    +[CryptoUtilities getKey:::] in CryptoUtilities.o 
"operator delete(void*)", referenced from: 
    __gnu_cxx::new_allocator<WBXML::CTag>::deallocate(WBXML::CTag*, unsigned long) in CTag.o 
    __gnu_cxx::new_allocator<int>::deallocate(int*, unsigned long) in CryptoUtilities.o 

Это не имеет никакого отношения к объектно-ориентированному модулю OpenSSL FIPS.

___cxa_pure_virtual и друзья являются частью среды выполнения C++. Похоже, вы смешиваете и сопоставляете libc++ (используется Xcode) и libstdc++ (предоставляется GNU).

Вы должны использовать libc++ для всего, что связано с Xcode. Это означает, что вы гарантируете, что -stdlib=libc++ находится во всех командных строках.

Если вы не можете использовать libc++ везде, то вам нужно использовать libstdc++ везде. Параметр Xcode показан ниже в разделе C++ Standard Library:

enter image description here

изображение выше для Crypto ++ с помощью libstdc++ (ГНУ библиотека, не Xcode по умолчанию). Хотя это и для вопроса Crypto ++, оно применимо и здесь.

+0

Thankyou очень много. Я уточнил вопрос более подробно. – Theguy