2015-12-22 8 views
9

Wenn ich GCC verwenden, kann ich Programm auf meinem Ubuntu 15.04 mit diesem Build:Static Link libstdC++ mit Klirren

-static-libgcc -static-libstdc++ 

Und kompilierte binäre kann ohne externe Pakete auf "Vorrat" Ubuntu 14.04 laufen, nur Standard-Updates .

Gibt es die Möglichkeit, mit dieser statischen Verknüpfung zu Bibliothek mit clang zu bauen?

Die häufigsten Antworten:

  • mit Test ubuntu rep (ppa:ubuntu-toolchain-r/test)
  • Update-Server
  • recompile auf Zielserver
  • GCC nicht verwenden

ist nicht geeignet für mich.

Kann ich das einfach mit clang für Ubuntu 14.04.3 LTS tun?

+0

Funktioniert das nicht? '-static -lstdC++' – Ashkan

+0

@Ashkan Nein, leider. – vladon

+2

@vladon Optionen '-static-libgcc -static-libstdC++' funktioniert gut mit mir mit clang ++ 3.6. – Danh

Antwort

11

clang ist kompatibel mit gcc in dieser Angelegenheit. Im Grunde genommen für hallo-Welt-Programm, das Iostream verwendet libstdc++ Anforderung zu gewährleisten (tatsächliche lib Versionen können zwischen Verteilungen variieren):

$ 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) 

Hier ist eine Abhängigkeit für libstdc++ und libgcc_s. Aber, wenn Sie -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) 

Die noch Abhängigkeit Blätter auf libc, aber das ist eine andere Frage.

clang: warning: argument unused during compilation: '-static-libstdc++' bedeutet clang ignoriert dieses Flag, weil Flag in der aktuellen Situation nutzlos ist. Die ersten beiden Beispiele, die mir in den Sinn kommen, sind das Kompilieren von C-Code (die offensichtlich nicht von libstdC++ abhängen) oder das Ausgeben von Nur-Kompilier-Befehlen ohne Verknüpfung (-c Flag). Da die Datei .o keine Informationen über statische oder dynamische Verknüpfungen enthalten kann, muss dieses Flag in der Verbindungsphase angegeben werden (und, um eine Warnung zu vermeiden, nur auf der Verbindungsphase).