2012-04-23 24 views
11

Jaki jest najlepszy sposób, aby powiedzieć, że CMake używa łącznika LLVM llvm-link zamiast GNU ld jako łącznika? Podczas konfigurowania projektu zUżywanie łącznika LLVM podczas używania Clanga i CMake'a

CXX=clang++ cmake <args> 

domyślny łącznik wydaje się być nietknięte, pozostając usr/bin/ld (w systemie Linux).

Czy jest to możliwe bez numeru using a separate toolchain file?

+0

https://stackoverflow.com/a/25274328/69663 wydaje się pokrewny – unhammer

Odpowiedz

11

Nie ma to związku z CMake: clang++ domyślnie używa systemowego linkera. Na przykład:

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

używa /usr/bin/ld do połączenia aplikacji. Aby zmienić łącznik do llvm-link, trzeba najpierw emitują LLVM kodu bajtowego, a następnie zadzwonić do łącznika, np .:

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

ten omija /usr/bin/ld.

+4

Jak można to zrobić za pomocą cmake? –

+0

Kiedy mówisz "linker systemowy", masz na myśli ten, który znajduje się pierwszy w twojej '$ PATH', czy też jest zakodowany w clang, aby użyć tego w'/usr/bin/'? – Ephemera

+0

Clang hardcodes ścieżkę wyszukiwania łącznika, AFAIK i próby pobrania binarnego pliku 'ld' w innych miejscach poza twoją' $ PATH'. Powiedziałem "system linker", aby odnieść się do standardowego linkera natywnego kodu obiektowego w przeciwieństwie do łącznika kodu bajtowego LLVM. – mavam

5

Od wersji 3.4, clang szuka linkera (ld) pod numerem GCCInstallation.getParentLibPath() + "/../" + GCCInstallation.getTriple().str() + "/bin", zanim znajdzie się na ścieżce ld. Powinieneś być w stanie umieścić swój linker w /usr/lib/gcc/<arch><sub>-<vendor>-<sys>-<abi>/<version>/ld i wywołać go w 1 kroku przez clang. Aby ręcznie określić tę lokalizację, należy użyć nieudokumentowanej flagi . Niestety, nie sądzę, że istnieje sposób na zmianę nazwy szukanego linkera, więc użycie ld.gold lub lld będzie wymagało dowiązania symbolicznego we wspomnianej lokalizacji.

Powiązane problemy