我正在研究touching up自制软件(OS X软件包管理器)llvm formula。不幸的是,关于我添加的部分的某些内容以一种我无法弄清楚的方式打破了构建。
tl; dr ld
要求为iOS模拟器提供包含_wordexp
符号的库,我绝对不知道它在哪里,如果它存在
当编译器尝试链接iOS模拟器的address sanitizer dylib时,编译始终失败。
复制步骤(据我所知,OS X没有* nix系统方便):
brew install llvm --with-clang --with-lldb --verbose --debug
projects/compiler-rt/lib/asan/CMakeFiles/clang_rt.asan_iossim_dynamic.dir
将以下行添加到link.txt
-Wl,-syslibroot /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
asan
make
在我的机器上的这一点,弹出这样的东西:
Undefined symbols for architecture x86_64:
"_wordexp", referenced from:
_wrap_wordexp in asan_interceptors.cc.o
substitution_wordexp in asan_interceptors.cc.o
(maybe you meant: _wrap_wordexp)
ld: symbol(s) not found for architecture x86_64
我认为只需在链接器搜索路径中添加另一个文件夹即可。事实证明并非如此简单:
wordexp.h
位于<path-to-iPhoneSimulator.sdk>/usr/include
,但正在运行
find . -type f -name "*.dylib" -print0 | xargs -0 nm | grep -n "T _wordexp" -B <large number> | less
Xcode-beta.app中的显示Xcode中唯一导出_wordexp
符号的.dylib位于WatchSimulator.platform
文件夹
/usr
中运行相同的命令,显示/usr/lib/system
中的3个库导出_wordexp
(libsystem_asl
,libsystem_c
和libsystem_blocks
),但是当我将/usr/lib/system
添加到搜索路径时链接器似乎并不关心,即使代码是它想要的x86_64代码,我找到的其他平台的相应dylib也不包含_wordexp
wordexp()
Perl wordexp
的内容,但是头文件肯定存在,wordexp()
显示在联机帮助页中,并且在编译OSX时,头文件中声明的函数似乎工作正常asan
文件夹及其父文件我错过了什么?鉴于这个错误似乎不是特别常见,可能是我的机器,但我希望机会很低,因为我本周末擦了并重新安装了我的电脑。
(OS X 10.11,Xcode / CLT 7.1,2012年中期Retina pro)
如果需要更多信息,我很乐意提供。
修改1:简化link.txt
修正。原来clang++
ld
的设置sysroot没有为/tmp/r
答案 0 :(得分:0)
原来错误是自制软件处理编译器标志的结果。那以及其他一些问题已经解决,所以这可能不再有用了。
对于那些对此如何破坏感到好奇的人,自制软件尝试更改编译器标志以抑制警告并创建更一致的构建体验。其中一项更改是删除任何-isysroot
或-system
标志,因为这是由自制软件本身在稍后阶段添加的。不幸的是,自制软件假设只使用OS X SDK,因此当构建期望使用iPhone模拟器SDK构建内容时,它指向OS X SDK。