2012-01-01 23 views
13

Mi chiedo quale sia l'opzione statica su gcc. Ho bisogno di questa opzione durante la compilazione di una determinata applicazione, tuttavia quando si verifica il seguente errore:- opzione statica per gcc?

gcc -static -O3 -o prog prog.c 
/usr/bin/ld: cannot find -lc 
collect2: ld returned 1 exit status 

Cosa deve essere installato?

versione di GCC:

[[email protected] dir]$ gcc -v 
Using built-in specs. 
COLLECT_GCC=gcc 
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.6.1/lto-wrapper 
Target: x86_64-redhat-linux 
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux 
Thread model: posix 
gcc version 4.6.1 20110908 (Red Hat 4.6.1-9) (GCC) 

risposta

-23

In genere si dovrebbe evitare di collegare staticamente l'applicazione (e si dovrebbe spiegare perché non si desidera il normale collegamento dinamico). Suggerisco almeno di collegare dinamicamente le librerie di sistema (libc in particolare) - se lo si desidera assolutamente, è possibile collegare staticamente le librerie meno comuni -. Perché vuoi collegare staticamente la tua applicazione? In genere è un errore (perché non si guadagna dagli aggiornamenti alle librerie dinamiche di sistema). In particolare le strutture name service switch da libc richiedono librerie dinamiche.

Il sistema deve aver installato il pacchetto che fornisce la libreria di libc statica. Su Debian, è il pacchetto libc-dev ma non so cosa sia su RedHat.

per scoprire cosa vuol gcc, passaggio che la bandiera -v come

gcc -v -static -O3 -o prog prog.c 

ma non si deve collegare in modo statico i vostri programmi. Sulle mie distribuzioni Debian, ci sono più di 700 programmi in /usr/bin e solo uno è collegato staticamente.

+0

Non ero sicuro di cosa faccia. Sto usando un'applicazione preesistente e per qualche motivo ha avuto questa opzione nel suo makefile. A questo punto penso che non dovrebbe essere più importante. Grazie. – sj755

+29

-1: nasconde la risposta in una cosa che è in gran parte una sfuriata con fatti di supporto limitati. – mattnz

5

La bandiera -static forza il linker per accettare solo le librerie statiche e non le eventuali librerie condivise.

Se si desidera utilizzare -static, è necessario assicurarsi di disporre di una versione statica della libreria C installata, che potrebbe essere difficile da trovare (la maggior parte dei sistemi non dispone più di una libreria C statica). O devi annullare l'effetto di -static. Tuttavia, nell'esempio, ciò annullerebbe lo scopo di -static poiché l'unica libreria collegata è (implicitamente) la libreria C.

+1

C'è qualche ragione particolare per cui non dovrebbe essere possibile semplicemente il linker legare staticamente il codice da qualsiasi libreria disponibile per il linker?Anche se i riferimenti all'interno del codice sono formattati in modo tale che devono essere risolti in fase di esecuzione, penso che dovrebbe essere possibile allegare le routine appropriate al file eseguibile e correggere i riferimenti in modo che puntino al codice all'interno del file eseguibile . – supercat

+0

@supercat: in una normale libreria di archivio, i singoli file oggetto sono identificabili separatamente e possono essere facilmente estratti dalla libreria e collegati nell'eseguibile. La mia impressione (semi-informata) è che le librerie condivise non contengono i file oggetto separati nello stesso modo, quindi ottieni tutto o non ottieni nulla. Oserei dire che potrebbe essere possibile collegare semplicemente l'intera libreria condivisa all'eseguibile, ma potrebbe anche portare alla creazione di un sacco di codice inutilizzato. So che alcune grandi aziende preferiscono utilizzare il collegamento statico per tutto, meno rischi di cambiamenti imprevisti. –

+1

Anche se il codice finisce per essere caricato dinamicamente, suggerirei che le applicazioni installate debbano, di default, ricevere ciascuna le proprie copie della maggior parte delle librerie. Se è necessario aggiornare le librerie, è possibile gestirle facendo in modo che il sistema operativo mantenga per ogni programma una configurazione delle "impostazioni di aggiornamento" [ad es. se un programma che utilizza FooLib 1.7 rileva che "FooLib 1.8" è installato, potrebbe consentire all'utente di eseguirlo con 1.7 o 1.8 e salvare la selezione come predefinita]. In questo modo se un programma ha problemi relativi a FooLib, l'utente può aggiornarlo, ma le cose non cambierebbero spontaneamente. – supercat

33

L'opzione -static collega un programma in modo statico, in altre parole non richiede una dipendenza dalle librerie dinamiche in fase di esecuzione per l'esecuzione.

Per ottenere il collegamento statico è necessario che le versioni di archivio (.a) delle librerie siano presenti nel sistema. quindi /usr/lib/libc.a /usr/lib/crt1.o etc ...

Sui moderni sistemi Linux (come si usa il cappello rosso): quando un binario lo collega insieme 1) inserisce il codice nell'eseguibile tramite i file .o e .a oppure 2) inserisce riferimenti a file di librerie dinamiche (.so) risolti da /lib/ld-linux.so (o/lib64/ld-linux = x86-64. così) che è sempre in un posto ben noto.

Per il tuo particolare sistema, se un programma sta specificatamente cercando di creare una versione statica di se stesso, allora devi installare le versioni statiche dei tuoi strumenti di sviluppo. È necessario, come minimo, il pacchetto glibc-static. Potresti aver bisogno anche di libstdC++ - pacchetto statico.

Problemi correlati