Using LLVM linker when using Clang & CMake

clangcmakelinker

What's the best way to tell CMake to use the LLVM linker llvm-link instead of GNU ld as linker? When configuring a project with

CXX=clang++ cmake <args>

the default linker appears to be untouched, remaining usr/bin/ld (on Linux).

Is this possible without using a separate toolchain file?

Best Answer

This turns out to be unrelated to CMake: clang++ uses the system linker by default. For example,

echo "#include <atomic>\n int main() { return 0; }" \
    | clang++ -x c++ -std=c++11 -stdlib=libc++ -

uses /usr/bin/ld to link the application. To change the linker to llvm-link, one needs to first emit LLVM byte code, and then call the linker, e.g.:

echo "#include <atomic>\n int main() { return 0; }" \
    | clang++ -x c++ -std=c++11 -stdlib=libc++ -S -emit-llvm -o - - \
    | llvm-link -o binary -

This bypasses /usr/bin/ld.

Related Topic