【问题标题】:Tutorial on embedding libclang in a Cocoa app在 Cocoa 应用程序中嵌入 libclang 的教程
【发布时间】:2014-06-02 07:22:29
【问题描述】:

有没有人有关于在 Cocoa 应用程序中嵌入 libclang 的好教程?

特别是我在启动时遇到了 rpath 的问题,说找不到 dylib。

错误是可爱的 dyld: Library not loaded: @rpath/libclang.dylib

【问题讨论】:

  • 现在 libclang 是默认 OS X 安装的一部分吗?如果是这样,您可以参考它而不是将其嵌入到您的应用程序包中
  • 不是。它与随 Xcode 一起安装的开发人员工具捆绑在一起。每个版本的 Xcode 可能有不同版本的 clang,并且 API 可能会因版本而异。最好链接到一个版本。更可靠。
  • Clang 文档 says 表明 libclang 有一个稳定的 C 接口,可以向后兼容。稳定的接口是使用libclang而不是其他Clang库的原因之一。
  • 确实如此。但是您不能保证或要求在安装需要 clang 的应用程序的位置安装 Xcode 或 clang。 Xcode 也不包含 libclang 的头文件。链接到另一个应用程序包内是一个严重的问题。
  • 好的 - 你能粘贴错误吗?

标签: macos cocoa libclang


【解决方案1】:

这个错误很遗憾地试图告诉你的是 lib clang 认为它的 @rpath 是你的应用程序包的根目录,但它不是。

就在前几天,我艰难地想通了这一点。 这个很难(硬。 您必须使用构建阶段设置对 libclang.a 做一些疯狂的事情。 在目标的构建阶段中,您需要添加一些运行脚本阶段。

一个是这样的:

echo "warning: OTOOL BEGIN1";
pwd;
otool -L ${SRCROOT}/Clangwrap/ClangAndLLVM/lib/libclang.dylib;
echo "Warning: OTOOL END1";

这只是做一些事情。 首先,它用日志很好地把事情夹在中间,看看发生了什么。 第二个是它实际上只是在复制后确认您的库的路径。 (是的,您应该将其复制到您的项目中以保持理智。) otool 就是这样做的。 SRCROOT 是您项目的根目录,之后的任何内容都是您在 Finder 中项目文件夹中到您要使用的库的相对路径。

再一次,这只是证实了它就是您认为的位置。

好的,下一步。这是真正的笨蛋。

echo "BEGIN install_name_tool";
install_name_tool -id @executable_path/../Frameworks/libclang.dylib ${SRCROOT}/Clangwrap/ClangAndLLVM/lib/libclang.dylib;
echo "END install_name_tool";

这会运行晦涩的命令行工具 install_name_tool 并用于设置 lib 认为它位于应用程序包中的路径。如果不这样做,lib 会认为它在其他路径中。你将把这条路径设置成你想要的样子。在 Mac 应用程序中,我使用了包中的 Frameworks 文件夹,因此我将其设置为这样。 install_name_tool 的第一个参数是您的应用程序包中 lib 所在的相对路径。第二个参数是 lib 当前在您的项目中的位置,以便 install_name_tool 可以设置其可执行路径。 这从字面上修改了一些库,因此它是可加载的。 libs 必须知道自己的加载路径。

请注意,第一步只是您自己的理智可选。 第二步是必需的,两者都应该发生在编译源构建阶段之前。 单击并拖动以将它们向上移动。

现在是最后一步。添加一个新的复制文件阶段,这将在您的构建阶段中保持最后。 将目标设置为与 install_name_tool 的第一个参数相同,这样您就知道您的相对路径已设置,这就是您要放置 lib 的位置。 我使用了框架。 现在将文件添加到此构建阶段,对于 iPhone,添加 libclang.a(我认为您不能在 iOS 上使用 libclang.dylib)

注意,您看到我使用 libclang.dylib,那是因为我在 Mac 应用程序项目中执行此操作。几乎任何事情都应该是相同的过程。

这不是一个容易或容易发现的过程,我从几个博客和文档中拼凑而成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多