在Cocoa应用程序中嵌入libclang的人上手很好吗?
特别是我在启动时遇到rpath问题,说找不到dylib。
错误是可爱的dyld: Library not loaded: @rpath/libclang.dylib
最佳答案
可悲的是,此错误试图告诉您的是lib clang认为其@rpath位于应用程序包的根目录,但事实并非如此。
前几天,我想出了很难的办法。
这个很难(硬。
您必须使用Build Phase设置对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会认为它在另辟path径。您将将此路径设置为您想要的样子。在Mac应用程序中,我使用了捆绑包内的Frameworks文件夹,因此将其设置为此类。 install_name_tool的第一个参数是应用包中lib所在的相对路径。第二个参数是库当前在项目中的位置,以便install_name_tool可以设置其可执行路径。
这实际上会修改lib的一部分,以便可加载。库必须知道自己的加载路径。
请注意,第一步仅出于您自己的理智考虑是可选的。
第二步是必需的,并且两者都应在“编译源”构建阶段之前进行。
单击并拖动以将其向上移动。
现在是最后一步。添加一个新的“复制文件”阶段,该阶段将保留在您的构建阶段的最后。
将目标设置为与install_name_tool的第一个参数相同的位置,以便您知道已设置相对路径,这就是放置lib的位置。
我使用框架。
现在,将文件添加到此构建阶段,对于iPhone,添加libclang.a(我认为您不能在iOS上使用libclang.dylib)
请注意,您看到我使用libclang.dylib,这是因为我在Mac应用程序项目中执行了此操作。几乎任何事情都应该是相同的过程。
这不是一个简单或容易发现的过程,我通过几个博客和文档将其拼凑而成。
关于macos - 在 cocoa 应用程序中嵌入libclang的教程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23989224/