Enlace estático libstdc++ usando clang

 C Programming >> Programación C >  >> Tags >> Clang
Enlace estático libstdc++ usando clang

clang es compatible con gcc en este asunto. Básicamente para el programa hello-world que usa iostream para garantizar libstdc++ requisito (las versiones reales de lib pueden variar entre distribuciones):

$ clang++ test.cpp
$ ldd ./a.out
        linux-vdso.so.1 (0x00007ffec65c0000)
        libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libstdc++.so.6 (0x00007ff937bb6000)
        libm.so.6 => /lib64/libm.so.6 (0x00007ff9378b6000)
        libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libgcc_s.so.1 (0x00007ff93769e000)
        libc.so.6 => /lib64/libc.so.6 (0x00007ff9372fe000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff937f3e000)

Aquí hay una dependencia para libstdc++ y libgcc_s . Pero si agrega -static-libgcc -static-libstdc++ :

$ clang++ test.cpp -static-libgcc -static-libstdc++
$ ldd ./a.out
        linux-vdso.so.1 (0x00007ffe5d678000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fb8e4516000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fb8e4176000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb8e4816000)

Eso todavía deja la dependencia en libc , pero esa es otra pregunta.

clang: warning: argument unused during compilation: '-static-libstdc++' significa que clang ignoró esta bandera, porque la bandera es inútil en la situación actual. Los dos primeros ejemplos que me vienen a la mente son compilar código C (que obviamente no depende de libstdc++), o emitir un comando de solo compilación sin vincular (-c bandera). Desde .o El archivo no puede contener información sobre enlaces estáticos o dinámicos, este indicador debe especificarse en la fase de enlace (y, para evitar advertencias, solo en la fase de vinculación).