2012-04-23 16 views

Respuesta

11

Esto no está relacionado con CMake: clang++ usa el enlazador del sistema de forma predeterminada. Por ejemplo,

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

utiliza /usr/bin/ld para enlazar la aplicación. Para cambiar el enlazador para llvm-link, uno tiene que emitir primer código byte LLVM, y luego llamar al enlazador, por ejemplo .:

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

Esto evita /usr/bin/ld.

+4

¿Y cómo se puede hacer esto con cmake? –

+0

Cuando dices 'enlazador del sistema', ¿te refieres al que encuentra primero en tu '$ PATH', o está codificado en clang para usar el de'/usr/bin/'? – Ephemera

+0

Clang codifica la ruta de búsqueda del vinculador, AFAIK, e intenta recoger el binario 'ld' en otros lugares además de' $ PATH'. Dije "enlazador del sistema" para referirme al enlazador estándar del código de objeto nativo en oposición al enlazador de código de bytes LLVM. – mavam

5

A partir de 3.4, clang busca el vinculador (ld) en GCCInstallation.getParentLibPath() + "/../" + GCCInstallation.getTriple().str() + "/bin" antes de buscar ld en la ruta. Debería poder poner su enlazador en /usr/lib/gcc/<arch><sub>-<vendor>-<sys>-<abi>/<version>/ld y hacer que lo llame por clang en 1 paso. Para especificar esta ubicación manualmente, use indocumentado-B. Lamentablemente, no creo que haya una forma de alterar el nombre del enlazador que se busca, por lo que usar ld.gold o lld requerirá un enlace simbólico en la ubicación mencionada.

Cuestiones relacionadas