2014-01-24 94 views
0

我在我的應用程序中使用libxml2,並且已經動態鏈接它。它工作正常,直到我開始注意到動態庫已在10.9 OSX上更新,並且應用程序在10.8和10.7上運行時,由於libxml2的版本較低,我發現問題。 看到的問題是 警告:使用舊的207 我似乎得到解析這個錯誤但相同的代碼工作正常在10.9與版本209libxml2.a OSX上的鏈接問題10.9

爲了避免這個問題,我想對libxml的209編譯的程序靜態編譯我的代碼以使用libxml2.a。我遇到了多個問題。由於在我的機器中安裝的libxml2.a版本中缺少符號,我無法編譯。

我從git repo下載最新的代碼並編譯它。我沒有安裝它,但讓我的程序指向新的靜態庫。我仍然有同樣的問題。

Compile Flags 
Ld /devel/Build/Products/Debug/SecurityCoreUpdater normal x86_64 
    cd /devel/BPSUpdater 
    setenv MACOSX_DEPLOYMENT_TARGET 10.7 
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -L/devel/Build/Products/Debug -F/devel/Build/Products/Debug -filelist /devel/Build/Intermediates/BPSUpdater.build/Debug/BPSUpdater.build/Objects-normal/x86_64/SecurityCoreUpdater.LinkFileList -mmacosx-version-min=10.7 /devel/libxml2.a -lCF_LSXClient 

Undefined symbols for architecture x86_64: 
    "_libiconv", referenced from: 
     _xmlIconvWrapper in libxml2.a(encoding.o) 
    "_libiconv_close", referenced from: 
     _xmlFindCharEncodingHandler in libxml2.a(encoding.o) 
     _xmlCharEncCloseFunc in libxml2.a(encoding.o) 
    "_libiconv_open", referenced from: 
     _xmlFindCharEncodingHandler in libxml2.a(encoding.o) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

有沒有解決這個問題?我很困惑如何解決這個問題。我討厭爲此改變解析器庫。這意味着我需要重新連線很多代碼。請幫忙。

問候, Varun的

回答

0

我找到了答案,有必要在「鏈接二進制與圖書館」中的「添加libiconv.a如果在其它鏈接器標記聯靜態地構建設置或添加libiconv.dylib構建階段「在xcode5。同樣,我也注意到需要將liblzma作爲動態庫或靜態庫來解決問題。

當添加爲動態庫(dylib)時,大多數導入考慮因素是存在庫的順序。顯然,libiconv和liblzma必須低於libxml2.a才能正確編譯。我不確定爲什麼這是必要的,但我能夠使用相同的程序解決問題。然而,我靜態編譯了所有三個庫,因爲我不想運行在OS之間的這個動態lib版本更改,因爲我的安裝程序不檢查已安裝的庫版本。

+0

這不適合我。我已經靜態編譯libxml2,liblzma和libiconv並將它們添加到我的項目中,但無論我鏈接的任何順序如何,我總是會得到原始問題中提到的鏈接器錯誤。 –

+0

我不知道這是如何在你的xcode,但確保你沒有任何動態鏈接。然後在「其他鏈接器標記」中添加以下內容/opt/local/lib/libxml2.a /opt/local/lib/libiconv.a /opt/local/lib/liblzma.a /opt/local/lib/libcrypto.a /opt/local/lib/libz.a。有可能你不需要/opt/local/lib/libcrypto.a,只是試驗下面的配置。確保您只使用端口安裝的庫,如下所示。默認情況下SDK的一部分庫只是動態庫。 – user2085689

+0

另一個我學到的重要教訓是,即使它包含在SDK中,也不要直接使用libxml。最好使用NSXML包裝來確保它不會中斷。 – user2085689