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

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

由于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/

相关文章:

c++ - 如何计算 32 位 float epsilon?

c# - 从另一个进程获取win32线程的StartAddress

python - libsvm 中的大量训练和测试数据

c++ - QTabWidget 选项卡旁边的 QWidget

mysql - 在 OSX 上安装 mysql gem 有困难

c++ - 具有默认模板类型的默认构造函数的类型推导

objective-c - 在存在新 API 时构建向后兼容的 OS X 应用程序?

c - 为什么这个字符串不会溢出缓冲区?

c++ - 使用 SFINAE 的代码与 GCC 一起使用,但不与 Clang 一起使用

c++ - 使用 libc++ 输出 wchar_t