我在Xcode 4.2中的XCode项目中构建和运行多个库时遇到了一些问题。基本上我试图创建一个库(lib 1),我有第二个库(lib 2)和第三方库(lib 3)。
我有lib 1,它对lib 2和lib 3有目标依赖。然后我在lib 1上为主项目添加了一个目标依赖项。目前我不包括lib 3.
所以现在lib 2使用类别。为了不获取无法识别的选择器错误消息,我将-ObjC
添加到了lib 1的其他链接器标志中,我还将该标志添加到主项目Other Linker Flags。
当我添加需要自己的一组框架的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的源代码。
更新 好吧,我把上一个项目的类别搞定了。设法让第三方lib进行编译。然而问题是,一旦我开始拨打该lib,我现在就会收到一堆错误。
我必须将第三方库以及libsqlite3.0.dylib和libz.dylib添加到我的lib和应用程序中以减少错误数量。如果我只将这些库添加到我自己的库中,那么我得到55个错误而不是32个。
有些错误是 架构armv7的未定义符号: " __ ZNSs6assignEPKcm",引自: - libSecurIDLib.a中的[ZGXid50 processSidc:pn:nc:otp:](OtpProcessor.o) libSecurIDLib.a中的__ZN7MtEbU23C2Ev(SidcCodeGenerator.o) libSecurIDLib.a中的__ZN17AbstractStatement8parseRowEP12sqlite3_stmt(abstractstatement.o) libSecurIDLib.a中的_ ZN6cSPej57LUshm17ERKSt6vectorIhSaIhEEiiRSs(SidcAlgo.o) " _Znwm",引自: libSecurIDLib.a中的__ZNSt6vectorIhSaIhEE20_M_allocate_and_copyIPhEES3_mT_S4_(SecurIDLib.o) libSecurIDLib.a中的__ZNSt6vectorIhSaIhEE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPhS1_EEmRKh(SecurIDLib.o) - libSecurIDLib.a中的[ZGXid50 processSidc:pn:nc:otp:](OtpProcessor.o) libSecurIDLib.a中的__ZNSt6vectorIhSaIhEE20_M_allocate_and_copyIPKcEEPhmT_S6_(OtpProcessor.o) - libSecurIDLib.a中的[iueMb3 init](TokenAdministration.o) - libSecurIDLib.a中的[iueMb3 saveTokenToDatabase:](TokenAdministration.o) libSecurIDLib.a中的__ZN5boost6detail12shared_countC2I10TokenStoreEEPT_(TokenAdministration.o) ... " __ ZNSs12_M_leak_hardEv",引自: libSecurIDLib.a中的_ ZN11TokenMapper11convertDateERKN3RSA7SecurID9RtpStringIhEE(tokenmapper.o) " _ZNSsC1EPKcRKSaIcE",引自: - libSecurIDLib.a中的[iueMb3 init](TokenAdministration.o) - libSecurIDLib.a中的[iueMb3 deleteToken:](TokenAdministration.o) - libSecurIDLib.a中的[iueMb3 removeAllTokens](TokenAdministration.o) - libSecurIDLib.a中的[qvFih2 init](AppDataManager.o) - libSecurIDLib.a中的[qvFih2 isEulaAccepted](AppDataManager.o) - libSecurIDLib.a中的[qvFih2 initAppData](AppDataManager.o) - libSecurIDLib.a中的[qvFih2 setEulaAccepted:](AppDataManager.o) ... " __ ZSt9terminatev",引自: libSecurIDLib.a中的_ ZN3RSA6Crypto15RandomNumberGen11getInstanceEv(TokenData.o) " _ZdlPv",引自: libSecurIDLib.a中的__ZNSt12_Vector_baseIhSaIhEED2Ev(SecurIDLib.o) libSecurIDLib.a中的__ZNSt6vectorIhSaIhEE13_M_assign_auxIPhEEvT_S4_St20forward_iterator_tag(SecurIDLib.o) libSecurIDLib.a中的__ZNSt6vectorIhSaIhEE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPhS1_EEmRKh(SecurIDLib.o) - libSecurIDLib.a中的[ZGXid50 processSidc:pn:nc:otp:](OtpProcessor.o) libSecurIDLib.a中的__ZNSt6vectorIhSaIhEE13_M_assign_auxIPKcEEvT_S5_St20forward_iterator_tag(OtpProcessor.o) - libSecurIDLib.a中的[iueMb3 init](TokenAdministration.o) - libSecurIDLib.a中的[iueMb3 saveTokenToDatabase:](TokenAdministration.o)
有什么想法吗?
更新2
将构建选项下的编译器设置从默认的Apple LLVM编译器3.1更改为LLVM GCC 4.2并获得了一组不同的错误,但仍然有32个错误。
架构armv7的未定义符号: " std :: basic_string,std :: allocator> :: assign(char const *,unsigned long)",引自: - libSecurIDLib.a中的[ZGXid50 processSidc:pn:nc:otp:](OtpProcessor.o) libSecurIDLib.a中的MtEbU23 :: MtEbU23()(SidcCodeGenerator.o) libSecurIDLib.a中的AbstractStatement :: parseRow(sqlite3_stmt *)(abstractstatement.o) libSecurIDLib.a中的cSPej5 :: LUshm17(std :: vector> const&,int,int,std :: basic_string,std :: allocator>&)(SidcAlgo.o) " operator new(unsigned long)",引自: libSecurIDLib.a中的unsigned char * std :: vector> :: _ M_allocate_and_copy(unsigned long,unsigned char *,unsigned char *)(SecurIDLib.o) libSecurIDLib.a中的std :: vector> :: _ M_fill_insert(__ gnu_cxx :: __ normal_iterator>&gt ;, unsigned long,unsigned char const&)(SecurIDLib.o) - libSecurIDLib.a中的[ZGXid50 processSidc:pn:nc:otp:](OtpProcessor.o) libSecurIDLib.a中的unsigned char * std :: vector> :: _ M_allocate_and_copy(unsigned long,char const *,char const *)(OtpProcessor.o) - libSecurIDLib.a中的[iueMb3 init](TokenAdministration.o) - libSecurIDLib.a中的[iueMb3 saveTokenToDatabase:](TokenAdministration.o) libSecurIDLib.a中的boost :: detail :: shared_count :: shared_count(TokenStore *)(TokenAdministration.o) ... " std :: basic_string,std :: allocator> :: _ M_leak_hard()",引自: libSecurIDLib.a中的TokenMapper :: convertDate(RSA :: SecurID :: RtpString const&)(tokenmapper.o) " std :: basic_string,std :: allocator> :: basic_string(char const *,std :: allocator const&)",引自: - libSecurIDLib.a中的[iueMb3 init](TokenAdministration.o) - libSecurIDLib.a中的[iueMb3 deleteToken:](TokenAdministration.o) - libSecurIDLib.a中的[iueMb3 removeAllTokens](TokenAdministration.o) - libSecurIDLib.a中的[qvFih2 init](AppDataManager.o) - libSecurIDLib.a中的[qvFih2 isEulaAccepted](AppDataManager.o) - libSecurIDLib.a中的[qvFih2 initAppData](AppDataManager.o) - libSecurIDLib.a中的[qvFih2 setEulaAccepted:](AppDataManager.o) ... " std :: terminate()",引自: libSecurIDLib.a(TokenData.o)中的RSA :: Crypto :: RandomNumberGen :: getInstance()