2013-02-25 12 views
6

Questo è un po 'imbarazzante. So cosa sta succedendo, ma non perché. Ricevo un errore di "riferimento non definito" che significa che il linker (ld) non sta mettendo il codice dalla libreria che ho creato.Problemi con ld e libreria statica "riferimento non definito a"

Attualmente sto scherzando con Zed A. Shaw "Learn C the Hard Way" corso. Sto cercando di completare l'esercizio 32, ma continuo a ricevere lo stesso errore.

Nel libro si sviluppa un make file che esegue il seguente comando:

cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG build/liblcthw.a \ 
    tests/list_tests.c -o tests/list_tests 

dove -g è quello di consentire le informazioni di debug, -Wall è quello di consentire "tutti" gli avvertimenti, -Wextra è quello di consentire una più warnings, -Isrc per includere la directory src nella directory della libreria, -o tests/list_tests è quello di produrre un output con quel nome in quella directory, -DNDEBUG per abilitare una variabile dal codice, -O2 per l'ottimizzazione del livello 2 (qualunque cosa ciò significhi) e compilare/liblcthw.a per includere quella libreria (quella che sta per essere compilata). Per il resto non ho idea di quello che fanno.

Se ho capito bene c'è un elenco.c nella directory src che crea un elenco di oggetti. Questo oggetto è in seguito incluso nella lib tramite ar e ranlib. Quindi chiamare l'header list.h dovrebbe fare ld per cercare in build/liblcthw.a per list.o. La cosa è che ld non sta leggendo build/liblcthw.a per qualche ragione. Quindi ottengo questo riferimento indefinito all'errore.

Ho provato a contattare Zed, ma a quanto pare è un uomo impegnato. Quindi spero di ricevere aiuto qui. Dimmi se ho bisogno di aggiungere ulteriori informazioni sul problema. Here's un collegamento all'intera libreria finora.

Spero che qualcuno possa aiutarmi.

+7

ordine le cose. Le librerie statiche vanno * dopo * i file source/object nella riga di comando. –

+0

Non ho ricevuto la vostra raccomandazione –

+3

Modificare l'ordine degli argomenti della riga di comando. Il file. C deve andare prima e il file .a deve andare dopo. –

risposta

6

Il seguente lavoro funziona?

 
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG tests/list_tests.c \ 
    -o tests/list_tests -Lbuild -llcthw 

Quello che fa è utilizzare l'opzione -l di collegare alla libreria, e l'opzione -L per specificare una directory supplementare dove il linker deve cercare le librerie. Il prefisso lib e il suffisso .a non devono essere specificati nell'argomento -l.

Si noti che se si dispone anche di una libreria condivisa (* .so) nella directory "build", le cose si complicano. Per semplificare le cose, dovresti eliminare il file "liblcthw.so" e mantenere solo "liblcthw.a", o provare a collegarlo alla libreria statica elencandolo come input, proprio come hai fatto in origine, ma specificandolo dopo il file sorgente:

 
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG tests/list_tests.c \ 
    -o tests/list_tests build/liblcthw.a 
+0

Che _kinda_ aiuto. Il programma è stato compilato ma ora durante l'esecuzione di questo errore appare "./tests/list_tests: errore durante il caricamento delle librerie condivise: liblcthw.so: impossibile aprire il file oggetto condiviso: Nessun file o directory" Cerca liblcthw.so nella directory della libreria ? Se sì, come posso evitarlo? –

+0

@LucianoRobino * C'è * un file "liblcthw.so" nella directory "build"? Perché se non ci fosse, il comando di compilazione sarebbe fallito. –

+0

Questo non utilizzerà la libreria statica. –