我应该如何在OS X上最好地从svn安装和使用libc ++

时间:2014-11-21 11:31:24

标签: c++ macos clang++ dyld libc++

由于clang的发布版本中有a bug,我需要从SVN trunk中编译并安装它。我想我也可以同时编译SVN trunk libc ++。我正在运行一个最新的OS X 10.10.1,其中macports需要安装libs和二进制文件。

我已经设法使用本文末尾的命令编译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运行我的可执行文件来使其正常工作,但如果可能的话我宁愿拥有更清晰的解决方案。

有关如何使其发挥作用的任何想法或意见,或者更确切地说应该如何进行?

编辑:#14; 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

1 个答案:

答案 0 :(得分:0)

如果您的问题出在运行时并且您想要这样做,我建议您使用MacPorts,因为我上个月在libcxx和libcxxabi端口添加了对此的支持。

具体来说,安装libcxx和libcxxabi端口并在构建时设置+ replacemnt_libcxx变量,我们将为您构建一个可以安装在/ opt / local / var / system_roots中的根。要安装root,请使用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)编译器,或使用&#39; sudo port select clang&#39;设置你想要默认的&#39; clang ++&#39;