由于a bug在clang的release版本中,我需要从SVN trunk编译安装。我想我还不如同时编译 SVN trunk libc++。我正在运行最新的 OS X 10.10.1,在需要的地方安装了 macports 库和二进制文件。
我已经成功地使用本文末尾的命令编译了 clang 和 libc++,并将它们安装到 $HOME/usr/local/
中。使用 $HOME/usr/local/bin/clang++
编译我的程序工作正常。但是,运行可执行文件时,使用的 libc++ 版本是系统版本。 (如在运行之前设置 export DYLD_PRINT_LIBRARIES=1
所见。)
然后我尝试了 export DYLD_LIBRARY_PATH=$HOME/usr/local/lib
这使得所有可执行文件都使用新版本的 libc++。但是,似乎其他一些可执行文件不喜欢使用 libc++ 的这种更改。例如,ls
失败并出现以下错误:
dyld: Symbol not found: __ZTISt9bad_alloc
Referenced from: /usr/lib/libutil.dylib
Expected in: /Users/d97sjan/usr/local/lib/libc++.1.dylib
in /usr/lib/libutil.dylib
Trace/BPT trap: 5
这是 libc++ 或 dyld 中的错误,还是我疯狂地相信通过设置 DYLD_LIBRARY_PATH
全局换出 libc++ 是可行的?
我可以通过使用 DYLD_LIBRARY_PATH=$HOME/usr/local/lib a.out
运行我的可执行文件来让它工作,但我宁愿有一个更干净的解决方案如果可能的话。
关于如何让它发挥作用,或者更确切地说,它应该如何完成,有什么想法或意见吗?
编辑:根据“The Paramagnetic Croissant”的评论,将 libc++ 换成其他二进制文件是不可行的 [尽管它适用于某些]。 我可以在编译时在我的二进制文件中向 dyld 添加一些提示,以便它加载正确的 libc++ 吗? 或者我应该坚持使用标准的 libc++ 并编译我自己的 clang? 谁有什么建议?
clang和libc++编译安装代码
# From http://clang.llvm.org/get_started.html
svn co -q http://llvm.org/svn/llvm-project/llvm/trunk llvm
svn co -q http://llvm.org/svn/llvm-project/cfe/trunk llvm/tools/clang
svn co -q http://llvm.org/svn/llvm-project/clang-tools-extra/trunk llvm/tools/clang/tools/extra
svn co -q http://llvm.org/svn/llvm-project/compiler-rt/trunk llvm/projects/compiler-rt
#From http://libcxx.llvm.org/
svn co -q http://llvm.org/svn/llvm-project/libcxx/trunk llvm/projects/libcxx
mkdir llvm_build_release
cd llvm_build_release
cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME/usr/local -DLLVM_TARGETS_TO_BUILD=host ../llvm
ninja
ninja install
最佳答案
如果您的问题与运行时有关并且您想这样做,我建议您使用 MacPorts,因为我上个月在 libcxx 和 libcxxabi 端口中添加了对此的支持。
具体来说,在构建时使用 +replacemnt_libcxx 变体集安装 libcxx 和 libcxxabi 端口,我们将为您构建一个根目录,您可以将其安装在/opt/local/var/system_roots 中。要安装根目录,请使用 darwinup:
sudo darwinup install /opt/local/var/system_roots/libcxxabi-*
sudo darwinup install /opt/local/var/system_roots/libcxx-*
因为这将替换系统库,请准备好启动到目标磁盘模式并在出现问题时卸载根目录:
sudo darwinup -p /Volumes/TargetDisk list
sudo darwinup -p /Volumes/TargetDisk uninstall <id for libcxx root>
sudo darwinup -p /Volumes/TargetDisk uninstall <id for libcxxabi root>
另请注意,libcxx 和 libcxxabi 的版本来自 llvm-3.5.0。我不确定该版本与 OS X 10.10.1 中的版本之间的确切区别,我不确定它是否包含您需要的修复程序。如果没有,请在 MacPorts trac 中提出问题,我会为您精心挑选。
如果您的问题与 STL 有关,那么我再次建议您使用 MacPorts 并只安装您想要的 clang 端口:
sudo port -v -s install clang-3.4
sudo port -v -s install clang-3.5
sudo port -v -s install clang-3.6
然后您可以从命令行使用 clang++-mp-3.4(或 3.5/3.6)编译器或使用“sudo port select clang”来设置您希望“clang++”的默认值
关于c++ - 我应该如何最好地从 OS X 上的 svn 安装和使用 libc++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27060369/