2014-01-24 60 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