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.
ordine le cose. Le librerie statiche vanno * dopo * i file source/object nella riga di comando. –
Non ho ricevuto la vostra raccomandazione –
Modificare l'ordine degli argomenti della riga di comando. Il file. C deve andare prima e il file .a deve andare dopo. –