2010-01-21 19 views
7

Sto utilizzando gcc per compilare un programma che devo collegare a una libreria C con nome non standard; è chiamato stuff.a anziché libstuff.a.Collegamento di libreria C con nome non standard

Non riesco a modificare il nome del file (problemi di autorizzazione).

Non voglio per includere la libreria completa (vale a dire utilizzando gcc program.c stuff.a -oprogram)

voglio compilare come gcc program.c -L/path/to/library/ -lstuff -oprogram ma gcc non troverà la libreria (perché non è chiamato libstuff.a).

Sto lavorando su una macchina Linux.

Come posso ottenere il collegamento (dinamico) fatto?

EDIT:

tutti voi, e le mie scuse Grazie per una domanda mal formulata.

Io non aveva nemmeno un oggetto condiviso (ho pensato che avrei potuto collegare in modo dinamico in un file .a *), quindi questo confuso molti di voi. Di nuovo, scuse per la mia ignoranza.

Quello che ho finito per fare è creare l'oggetto condiviso in una directory locale, aggiungendo la posizione in cui la mia variabile d'ambiente LD_LIBRARY_PATH, e il collegamento di nuovo.

Funziona come un fascino (da eseguibile da 1,3 M fino a 5,8K).

Grazie ancora.

+0

Fa una versione oggetto condiviso della libreria esistono (stuff.so)? – jschmier

+0

dimenticato di menzionare, sto lavorando su Linux. – Escualo

+0

@jschmier: no, solo la libreria '.a'. – Escualo

risposta

6

Supponendo che una versione di oggetto condiviso della libreria statica non esista, potrebbe essere necessario crearne una. Ricorda che la libreria statica stuff.a è solo un archivio ar.

ar -x stuff.a 
gcc -shared *.o -o libstuff.so 

Questo presuppone che si desidera per collegare contro di essa come una libreria condivisa e non semplicemente compilare nella tua binario.

+6

Interessante, ma i file .o devono essere stati compilati come codice indipendente dalla posizione per far sì che funzioni, cosa che non avrebbero potuto essere se fossero stati pensati per una libreria statica, giusto? –

+1

Questa è la risposta giusta perché non avevo nemmeno un oggetto condiviso. Ho finito per crearne uno e il collegamento. Da un eseguibile di 1.3M (con l'approccio originale) ho passato a un eseguibile di 5.8K. Questo e spettacolare. Grazie. – Escualo

+1

+1 per utilizzo avanzato della sfera di cristallo o capacità di lettura della mente;) – Christoph

4

È possibile creare un collegamento simbolico a stuff.a chiamato libstuff.a? È anche possibile creare il collegamento simbolico in un'altra directory (ad esempio, non una directory di libreria standard) e utilizzare l'opzione -L con gcc per includere la directory con il collegamento simbolico.

+0

Stavo pensando di farlo, e potrebbe essere quello che finisco per fare. Mi chiedevo solo se c'è una bandiera speciale che posso passare a gcc per far sapere che il nome non è standard. – Escualo

3

collegamento è come se fosse un file oggetto:

gcc blah.o /usr/local/lib/foo.a -o binary 

se non ti piace il percorso completo, basta usare una variabile. altrimenti si potrebbe analizzare il file LD_LIBRARY_PATH e di prova per l'esistenza ci

+0

@Arrieta: non secondo il manuale di gcc – Christoph

+0

Grazie, non l'ho fatto ora. – Escualo

+1

non è possibile collegarsi dinamicamente alla libreria statica, deve essere il collegamento statico in fase di compilazione. gli oggetti condivisi devono essere compilati con PIC, in genere le librerie statiche non sono compilate in questo modo. devi ancora caricare la libreria condivisa in memoria al momento dell'esecuzione, a meno che tu non stia eseguendo più thread, non otterrai molto – Anycorn

1

Basta dare il nome completo:

gcc program.c /path/to/library/stuff.a -oprogram 
5

Avresti dovuto un'occhiata al gcc manual:

L'unica differenza tra l'utilizzo di un opzione -l e specificando un nome di file è che -l circonda biblioteca con 'lib' e '.a' e ricerche diverse directory.

Non c'è niente di sbagliato nell'uso di stuff.a come argomento.

+0

Nella domanda iniziale c'era un "(dinamico)", ma sono sempre meno sicuro che l'OP significasse davvero. –

+0

Grazie. Non ero a conoscenza di questo, e con il tuo e altri commenti ora sono in grado di risolvere il mio problema. – Escualo

0

So che il problema si è rivelato essere uno con il tentativo di impostare una libreria statica come dinamicamente collegati, ma ho voluto aggiungere questo per amor di posteri:

Se lo si fa precedere il vostro argomento dell'opzione -l con i due punti , :, considererà il nome come letterale piuttosto che un nome che richiede la "lib" aggiunta in primo piano e l'estensione del file aggiunta alla fine.

Nel caso si descrivono in cui si desidera collegare contro una static.a piuttosto che un libstatic.a, ed a patto che non ha intenzione di collegare contro di essa in modo statico, il seguente dovrebbe funzionare:

gcc program.c -L/path/to/library/ -l:stuff.a -oprogram 

Si potrebbe naturalmente fare come hanno entrambi detto Richard Penington e Anycorn e semplicemente includere la libreria completamente pathed sulla riga di comando, invece così:

gcc program.c /path/to/library/stuff.a -oprogram 
Problemi correlati