У меня есть некоторые проблемы со сборкой и запуском нескольких библиотек в проекте XCode в Xcode 4.2. В основном я пытаюсь создать библиотеку (lib 1), у меня есть вторая библиотека (lib 2) и сторонняя библиотека (lib 3).
У меня есть lib 1 с целевой зависимостью от lib 2 и lib 3. Затем я добавил целевую зависимость для основного проекта на lib 1. Пока я не включаю lib 3.
Так что сейчас lib 2 использует категории. Чтобы не получить нераспознанное сообщение об ошибке селектора, я добавил -ObjC
к другим флагам компоновщика lib 1 и также добавил этот флаг к основным проектам других флагов компоновщика.
Когда я добавляю lib 3, для которой требуется собственный набор фреймворков, он жалуется на флаг -ObjC
. Если я удаляю его, все компилируется нормально, но затем я получаю сообщение об ошибке нераспознанного селектора. Как мне это исправить?
Это была одна из ошибок, которые я получал:
ld: duplicate symbol _dmhash in
/Users/Daniel/Library/Developer/Xcode/DerivedData/blah/lib.a(aes128hash.o) and
/Users/Daniel/Library/Developer/Xcode/DerivedData/blah/lib.a(aes128hash.o) for architecture armv7
Эта ошибка появлялась только во время использования lib 3 (третьей стороны). Он исчез, когда я удалил все фреймворки, необходимые для lib 3 и самой lib3. Затем я добавил все фреймворки по одной за раз, компилируя каждый раз. Если бы я сделал это и добавил lib 3 в конце, он успешно скомпилировался бы, пока я пропустил -ObjC
из флагов компоновщика. Это, конечно, привело к тому, что я получил нераспознанный селектор.
Имейте в виду, у меня нет исходного кода для lib 3.
Обновление
Ну, я обстрелял категории из предыдущего проекта. Это удалось получить стороннюю библиотеку для компиляции. Проблема, однако, в том, что, как только я начал звонить в эту библиотеку, я получаю кучу ошибок.
Мне пришлось добавить стороннюю библиотеку вместе с libsqlite3.0.dylib и libz.dylib как в мою библиотеку, так и в приложение, чтобы уменьшить количество ошибок. Я получал 55 ошибок вместо 32, если я только добавил эти библиотеки в свою собственную библиотеку.
Некоторые из ошибок
Неопределенные символы для архитектуры armv7:
"__ZNSs6assignEPKcm", на который ссылаются:
- [ZGXid50 processSidc: pn: nc: otp:] в libSecurIDLib.a (OtpProcessor.o)
__ZN7MtEbU23C2Ev в libSecurIDLib.a (SidcCodeGenerator.o)
__ZN17AbstractStatement8parseRowEP12sqlite3_stmt в libSecurIDLib.a (abstractstatement.o)
_ ZN6cSPej57LUshm17ERKSt6vectorIhSaIhEEiiRSs в libSecurIDLib.a (SidcAlgo.o)
" _Znwm", по ссылке с:
__ZNSt6vectorIhSaIhEE20_M_allocate_and_copyIPhEES3_mT_S4_ в libSecurIDLib.a (SecurIDLib.o)
__ZNSt6vectorIhSaIhEE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPhS1_EEmRKh в libSecurIDLib.a (SecurIDLib.o)
- [ZGXid50 processSidc: pn: nc: otp:] в libSecurIDLib.a (OtpProcessor.o)
__ZNSt6vectorIhSaIhEE20_M_allocate_and_copyIPKcEEPhmT_S6_ в libSecurIDLib.a (OtpProcessor.o)
- [iueMb3 init] в libSecurIDLib.a (TokenAdministration.o)
- [iueMb3 saveTokenToDatabase:] в libSecurIDLib.a (TokenAdministration.o)
__ZN5boost6detail12shared_countC2I10TokenStoreEEPT_ в libSecurIDLib.a (TokenAdministration.o)
...
"__ZNSs12_M_leak_hardEv", на который ссылаются:
_ ZN11TokenMapper11convertDateERKN3RSA7SecurID9RtpStringIhEE в libSecurIDLib.a (tokenmapper.o)
" _ZNSsC1EPKcRKSaIcE", на который ссылаются:
- [iueMb3 init] в libSecurIDLib.a (TokenAdministration.o)
- [iueMb3 deleteToken:] в libSecurIDLib.a (TokenAdministration.o)
- [iueMb3 removeAllTokens] в libSecurIDLib.a (TokenAdministration.o)
- [qvFih2 init] в libSecurIDLib.a (AppDataManager.o)
- [qvFih2 isEulaAccepted] в libSecurIDLib.a (AppDataManager.o)
- [qvFih2 initAppData] в libSecurIDLib.a (AppDataManager.o)
- [qvFih2 setEulaAccepted:] в libSecurIDLib.a (AppDataManager.o)
...
"__ZSt9terminatev", на который ссылаются:
_ ZN3RSA6Crypto15RandomNumberGen11getInstanceEv в libSecurIDLib.a (TokenData.o)
" _ZdlPv", ссылка на которую:
__ZNSt12_Vector_baseIhSaIhEED2Ev в libSecurIDLib.a (SecurIDLib.o)__ZNSt6vectorIhSaIhEE13_M_assign_auxIPhEEvT_S4_St20forward_iterator_tag в libSecurIDLib.a (SecurIDLib.o) __ZNSt6vectorIhSaIhEE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPhS1_EEmRKh в libSecurIDLib.a (SecurIDLib.o) - [ZGXid50 processSidc: р: н.д.: OTP:] в libSecurIDLib.a (OtpProcessor.o) __ZNSt6vectorIhSaIhEE13_M_assign_auxIPKcEEvT_S5_St20forward_iterator_tag в libSecurIDLib.a (OtpProcessor.o) - [iueMb3 init] в libSecurIDLib.a (TokenAdministration.o) - [iueMb3 saveTokenToDatabase:] в libSecurIDLib.a (TokenAdministration.o)
Есть идеи?
Обновление 2
Изменен параметр компилятора в параметрах сборки с компилятора Apple LLVM 3.1 по умолчанию на LLVM GCC 4.2 и получен другой набор ошибок, хотя по-прежнему выдается 32 ошибки.
Неопределенные символы дляАрхитектура armv7: "std :: basic_string, std :: allocator> :: assign (char const *, unsigned long)", на которую ссылаются из: - [ZGXid50 processSidc: pn: nc: otp:] в libSecurIDLib.a (OtpProcessor.o) MtEbU23 :: MtEbU23 ()в libSecurIDLib.a (SidcCodeGenerator.o) AbstractStatement :: parseRow (sqlite3_stmt *) в libSecurIDLib.a (abstractstatement.o) cSPej5 :: LUshm17 (std :: vector> const &, int, int, std :: basic_string, stdallocator> &) в libSecurIDLib.a (SidcAlgo.o) «оператор new (long без знака)», на который ссылаются из: unsigned char * std :: vector> :: _ M_allocate_and_copy (unsigned long, unsigned char *, unsigned char *) в libSecurIDLib.a (SecurIDLib.o) std :: vector> :: _ M_fill_insert (__gnu_cxx :: __ normal_iterator>>, беззнаковый длинный, беззнаковый символ const &) в libSecurIDLib.a (SecurIDLib.o) - [ZGXid50 processSidc: pn: nc: ot: nc: ot] в libSecurIDLib.a (OtpProcessor.o) без знака char * std :: vector> :: _ M_allocate_and_copy (без знака long, char const *, char const *) в libSecurIDLib.a (OtpProcessor.o) - [iueMb3 init] в libSecurIDLib.a (TokenAdministration.o) - [iueMb3 saveTokenToDatabase:] в libSecurIDLib.a (TokenAdministration.o) boost :: detail :: shared_count :: shared_count (TokenStore *) в libSecurIDLib.a (TokenAdministration.o) ... "std:: basic_string, std ::allocator> :: _ M_leak_hard () ", на который ссылается: TokenMapper :: convertDate (RSA :: SecurID :: RtpString const &) в libSecurIDLib.a (tokenmapper.o)" std :: basic_string, std :: allocator> :: basic_string (char const *, std :: allocator const &) ", на который ссылаются: - [iueMb3 init] в libSecurIDLib.a (TokenAdministration.o) - [iueMb3 deleteToken:] в libSecurIDLib.a (TokenAdministration.o) - [iueMb3 removeAllTokens в]libSecurIDLib.a (TokenAdministration.o) - [qvFih2 init] в libSecurIDLib.a (AppDataManager.o) - [qvFih2 isEulaAccepted] в libSecurIDLib.a (AppDataManager.o) - [qvFih2 initAppDaLata.ata в).- [qvFih2 setEulaAccepted:] в libSecurIDLib.a (AppDataManager.o) ... "std :: terminate ()", на который ссылаются из: RSA :: Crypto :: RandomNumberGen :: getInstance () в libSecurIDLib.a (TokenData.o))