有没有人有关于在 Cocoa 应用程序中嵌入 libclang 的好教程?
特别是我在启动时遇到了 rpath 的问题,说找不到 dylib。
错误是可爱的
dyld: Library not loaded: @rpath/libclang.dylib
遗憾的是,这个错误试图告诉您的是 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 可以设置其可执行路径。这从字面上修改了一些库,因此它是可加载的。库必须知道自己的加载路径。
请注意,第一步只是您自己的理智的可选步骤。第二步是必需的,两者都应该发生在编译源构建阶段之前。单击并拖动以将它们向上移动。
现在是最后一步。添加一个新的复制文件阶段,这将在您的构建阶段中保持最后。将目标设置为与 install_name_tool 的第一个参数相同,这样您就知道您的相对路径已设置,这就是您要放置 lib 的位置。我使用了框架。现在将文件添加到此构建阶段,对于 iPhone,添加 libclang.a(我认为您不能在 iOS 上使用 libclang.dylib)
请注意,您看到我使用 libclang.dylib,那是因为我在 Mac 应用程序项目中执行此操作。几乎任何事情都应该是相同的过程。
这不是一个容易或容易发现的过程,我是从几个博客和文档中拼凑起来的。