Использование LLVM-компоновщика при использовании Clang & CMake
Какой лучший способ сказать CMake использовать LLVM-компоновщик llvm-link
вместо GNU ld
в качестве компоновщика? При настройке проекта с помощью
CXX=clang++ cmake <args>
компоновщик по умолчанию выглядит нетронутым, оставаясь usr/bin/ld
(в Linux).
Возможно ли это без с использованием отдельного файла toolchain?
Ответы
Ответ 1
Это оказывается не связанным с CMake: clang++
по умолчанию использует системный компоновщик. Например,
echo "#include <atomic>\n int main() { return 0; }" \
| clang++ -x c++ -std=c++11 -stdlib=libc++ -
использует /usr/bin/ld
для связи приложения. Чтобы изменить компоновщик на llvm-link
, нужно сначала испустить байт-код LLVM, а затем вызвать компоновщик, например:
echo "#include <atomic>\n int main() { return 0; }" \
| clang++ -x c++ -std=c++11 -stdlib=libc++ -S -emit-llvm -o - - \
| llvm-link -o binary -
Это обходит /usr/bin/ld
.
Ответ 2
Начиная с 3.4, clang
ищет компоновщик (ld
) в GCCInstallation.getParentLibPath() + "/../" + GCCInstallation.getTriple().str() + "/bin"
, прежде чем он ищет ld
на пути. Вы можете разместить свой компоновщик в /usr/lib/gcc/<arch><sub>-<vendor>-<sys>-<abi>/<version>/ld
и вызвать его на clang
за 1 шаг. Чтобы указать это местоположение вручную, используйте недокументированный флаг -B
. К сожалению, я не верю, что есть способ изменить имя компоновщика, который был найден, поэтому использование ld.gold или lld потребует символической ссылки в вышеупомянутом местоположении.