链接器标志,类别和第三方库

时间:2011-12-13 18:01:45

标签: ios build xcode4.2

我在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()

0 个答案:

没有答案