关于在Cocoa应用程序中嵌入libclang的教程

时间:2014-06-02 07:22:29

标签: macos cocoa libclang

有没有人有一个很好的教程方便将libclang嵌入到Cocoa应用程序中?

特别是我在发布时遇到了rpath的问题,说无法找到dylib。

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

1 个答案:

答案 0 :(得分:1)

这个错误令人遗憾地试图告诉你的是,lib clang认为它的@rpath位于你的应用程序包的根目录中,但事实并非如此。

我前几天才想到这一点。 这很难。 你必须使用构建阶段设置使用libclang.a做一些疯狂的事情。 在目标的构建阶段中,您需要添加一些运行脚本阶段。

一个将是这个:

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

这只是做了一些事情。 首先,它很好地用日志将事物夹在中间,看看发生了什么。 第二个是它真的只是在复制之后确认你的lib的路径。 (是的,你应该把它复制到你的项目中以保持理智。) otool这样做。 SRCROOT是项目的根,然后是你在Finder中项目文件夹中你将要使用的lib的相对路径。

同样,这只是证实了它是你认为的地方。

好的,下一步。这真是太过分了。

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可以设置其可执行路径。 这实际上修改了一些lib,因此它是可加载的。 lib必须知道自己的加载路径。

请注意,第一步仅适用于您自己的理智。 第二步是必需的,两者都应该在Compile Sources Build阶段之前发生。 单击并拖动以将其向上移动。

现在是最后一步。添加新的复制文件阶段,这将在构建阶段保持最后。 将目标设置为与install_name_tool的第一个arg相同,以便您知道您的相对路径已设置以及您将要放置lib的位置。 我用过Frameworks。 现在将文件添加到此Build Phase,对于iPhone,添加libclang.a(我不认为你可以在iOS上使用libclang.dylib)

注意,你看到我使用了libclang.dylib,因为我在Mac应用程序项目中这样做了。几乎任何事情都应该是相同的过程。

这不是一个简单或可发现的过程,我将它从几个博客和文档拼凑而成。