2012-04-23 10 views
11

リンカーとしてGNake ldの代わりにLLVMリンカーllvm-linkを使用するようにCMakeに伝える最も良い方法はありますか?ClangとCMakeの使用時にLLVMリンカーを使用する

CXX=clang++ cmake <args> 

でプロジェクトを設定する場合、デフォルトのリンカは(Linux上)usr/bin/ld残り、そのままであるように思われます。

using a separate toolchain fileなしで可能ですか?

+0

https://stackoverflow.com/a/25274328/69663と思われる – unhammer

答えて

11

これは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を迂回します。

+4

これはどのようにしてcmakeで行うことができますか? –

+0

'システムリンカー'とは、 '$ PATH'で最初に見つかったものを意味しますか、'/usr/bin/'にあるものを使用するようにclangにハードコードされていますか? – Ephemera

+0

Clangはリンカ検索パスAFAIKをハードコードし、 '$ PATH'以外の場所で' ld'バイナリを取得しようとします。 LLVMバイトコードリンカとは対照的に、ネイティブオブジェクトコードの標準リンカを参照するために「システムリンカ」と言いました。 – mavam

5

3.4から、clangldを探す前にGCCInstallation.getParentLibPath() + "/../" + GCCInstallation.getTriple().str() + "/bin"にリンカー(ld)を探します。リンカーを/usr/lib/gcc/<arch><sub>-<vendor>-<sys>-<abi>/<version>/ldに入れ、clangで1ステップで呼び出すことができるはずです。この場所を手動で指定するには、文書化されていない-Bフラグを使用します。残念ながら、私は、ld.goldを使用して検索されるリンカーの名前を変更する方法があるとは考えていません。また、lldは前述の場所でシンボリックリンクが必要になります。

関連する問題