作为研究项目的一部分,我试图将clang 6.0.1与Xcode 9.4.1结合使用。我已经在自定义位置(/ opt / llvm-6_0_1 / clang)中构建并安装了clang。我写了一个简单的xcplugin编译器规范,将我的clang版本与Xcode集成在一起。
现在我可以在Xcode中打开项目,选择我的代理编译器并用它来代替Apple的默认clang来构建。
我必须对xcplugin的xcspec文件进行一些小的添加才能使其正常工作,这对大多数人来说可能并不有趣,因此除非有要求,否则我不会在此处提供详细信息。
这一切都适用于我玩过的大多数项目,但是我遇到了一个奇怪的问题,即我的clang副本找不到隐式链接的静态库。具体来说,我会收到此错误:
ld: file not found: /opt/llvm-6_0_1/clang/Toolchains/LLVM6.0.1.xctoolchain/usr/lib/arc/libarclite_macosx.a
clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)
请注意,Xcode项目未明确包含libarclite_macosx.a文件。我认为必须将其隐式包括在内,也许是因为该项目启用了ARC?
经过Xcode生成的链接命令行(很复杂)之后,我决定查看MyProject__dependency_info.dat文件,该文件是通过-dependency_info选项传递的。显然,此数据文件(路径定义为env var LD_DEPENDENCY_INFO_FILE)是在链接过程中创建的,而不是作为链接器的输入。可能是因为存在使用符号链接的黑客变通方法,而该符号链接是我用来获得工作链接的方法(最后介绍)。
无论如何,该格式似乎都是二进制的,但是我能够在文件中看到对libarclite_macosx.a的文本引用:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_macosx.a
启用-Xlinker -v选项后,我可以看到我建立的clang没有搜索默认的工具链库或弧路径,所以我添加了它们:
-L/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib
-L/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc
现在我可以在详细输出中看到搜索路径,但是clang仍然找不到该库:
Library search paths:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc
我尝试将路径添加到框架搜索路径。我还尝试定义各种链接路径env var。什么都没有。
为了试图了解clang的实际作用,我在遇到链接错误时使用了fs_usage:
sudo fs_usage -e -w -f filesys | grep "lib/arc"
14:11:00.461965 stat64 [ 2] /opt/llvm-6_0_1/clang/Toolchains/LLVM6.0.1.xctoolchain/usr/lib/arc>>>>>>>>>>>>>>>>>>>>>> 0.000006 ld.1421614
14:11:00.461968 stat64 [ 2] /opt/llvm-6_0_1/clang/Toolchains/LLVM6.0.1.xctoolchain/usr/lib/arc>>>>>>>>>>>>>>>>>>>>>> 0.000002 ld.1421614
很明显clang确实想在安装位置而不是-dependency_info中指定的位置,也不在我提供的搜索路径中查找此文件。
在此阶段,使构建生效的唯一方法是将Xcode的“ arc”目录的符号链接添加到已安装的clang lib目录中。那个“有效”,但是又脆弱又讨厌。
关于如何获取clang的任何想法都在寻找它实际所在的静态库?