Использование 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 потребует символической ссылки в вышеупомянутом местоположении.