【问题标题】:libxml2.a linking issues on OSX 10.9OSX 10.9 上的 libxml2.a 链接问题
【发布时间】:2014-02-14 23:32:51
【问题描述】:

我在我的应用程序中使用 libxml2 并且一直在动态链接它。它工作正常,直到我开始注意到动态库在 10.9 OSX 上更新,当应用程序在 10.8 和 10.7 上运行时,我看到由于 libxml2 版本较低而导致的问题。 看到的问题是 警告:使用旧 207 针对 libxml 209 编译的程序 我似乎遇到了解析错误,但是相同的代码在 10.9 版本 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)

有解决办法吗?我很困惑如何解决这个问题。我不想为此更改解析器库。这意味着我需要重新连接很多代码。请帮忙。

问候, 瓦伦

【问题讨论】:

    标签: macos xcode5 osx-mavericks libxml2


    【解决方案1】:

    我找到了答案,如果在构建设置中的其他链接器标志中静态链接,或者在 xcode5 的“构建阶段”的“将二进制文件与库链接”中添加 libiconv.dylib,则需要添加 libiconv.a。同样,我也注意到需要将 liblzma 包含为动态库或静态库来解决问题。

    添加为动态库 (dylib) 时最重要的导入考虑是库的存在顺序。显然,libiconv 和 liblzma 必须低于 libxml2.a 才能正确编译。我不确定为什么需要这样做,但我能够使用相同的程序解决问题。然而,我静态编译了所有三个库,因为我不想在操作系统之间遇到这种动态库版本更改,因为我的安装程序不检查已安装的库版本。

    【讨论】:

    • 这对我不起作用。我已经静态编译了 libxml2、liblzma 和 libiconv 并将它们添加到我的项目中,但是无论我链接的顺序是什么,我总是得到原始问题中提到的链接器错误。
    • 我不确定这在您的 xcode 中是什么样子,但请确保您没有任何动态链接。然后在“Other Linker Flags”中添加以下内容 /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 的库只是动态库。
    • 我学到的另一个重要教训是永远不要直接使用 libxml,即使它包含在 SDK 中。最好使用 NSXML 包装器来确保它不会损坏。
    • 谢谢!事实证明,问题在于我仍在使用系统提供的 libxml2 标头。当我切换到正确的标题时,错误就消失了。
    猜你喜欢
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多