Из-за Жук в выпускной версии clang мне нужно скомпилировать и установить его из ствола SVN. Я подумал, что мог бы также скомпилировать ствол SVN 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, или я просто схожу с ума, полагая, что глобальная замена libc ++ происходит путем установки DYLD_LIBRARY_PATH
возможно ли?
я Можно заставить его работать, запустив мой исполняемый файл с DYLD_LIBRARY_PATH=$HOME/usr/local/lib a.out
, но я бы предпочел более чистое решение, если это возможно.
Любые идеи или комментарии о том, как заставить это работать, или, скорее, как это должно быть сделано?
Редактировать: После комментария «Парамагнитного круассана» о том, что невозможно заменить 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 в прошлом месяце.
В частности, установите порты libcxx и libcxxabi с вариантом + replacemnt_libcxx, установленным во время сборки, и мы создадим вам рут, который вы можете установить в / 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 ++».