2009-10-04 10 views
46

Sto tentando di utilizzare la libreria libtommath. Sto usando l'IDE NetBeans per il mio progetto su Ubuntu Linux. Ho scaricato e compilato la libreria, ho fatto un 'make install' per inserire il file .a risultante in/usr/lib/e i file .h in/usr/includeTentativo di includere una libreria, ma continuo a ricevere "riferimento non definito" ai messaggi

Sembra trovare i file appropriatamente (dal momento che non ho più ricevuto quegli errori, cosa che ho fatto prima di installare nelle directory/usr).

Tuttavia, quando creo un semplice principale di effettuare una chiamata a mp_init (che si trova nella libreria), ottengo il seguente errore quando tento di fare il mio progetto:

mkdir -p build/Debug/GNU-Linux-x86 
rm -f build/Debug/GNU-Linux-x86/main.o.d 
gcc -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.c 
mkdir -p dist/Debug/GNU-Linux-x86 
gcc -o dist/Debug/GNU-Linux-x86/cproj1 build/Debug/GNU-Linux-x86/main.o 
build/Debug/GNU-Linux-x86/main.o: In function 'main': 
/home/[[myusername]]/NetBeansProjects/CProj1/main.c:18: undefined reference to `mp_init' 
collect2: ld returned 1 exit status 
make[2]: *** [dist/Debug/GNU-Linux-x86/cproj1] Error 1 

Così, sembra che il linker non riesce a trovare la funzione all'interno della libreria, tuttavia è lì, quindi non so cosa potrebbe causare questo.

Ho lo stesso errore se digito il comando gcc direttamente e salta il makefile, ho anche assicurato che la libreria statica sia stata compilata anche con gcc.

A cura di aggiungere:

ottengo gli stessi errori se lo faccio direttamente la compilazione e aggiungere biblioteca -l o -L:

$ gcc -l /usr/lib/libtommath.a main.c 
/usr/bin/ld: cannot find -l/usr/lib/libtommath.a 
collect2: ld returned 1 exit status 

$ gcc -llibtommath.a main.c 
/usr/bin/ld: cannot find -llibtommath.a 
collect2: ld returned 1 exit status 

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main': 
main.c:(.text+0x18): undefined reference to `mp_init' 
collect2: ld returned 1 exit status 

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main': 
main.c:(.text+0x18): undefined reference to `mp_init' 
collect2: ld returned 1 exit status 

Sono molto arrugginito su questa roba, così Non sono sicuro che sto usando il comando giusto qui, negli esempi -L sono state trovate le librerie? Se la biblioteca non viene trovata, come faccio a trovarla? È in/usr/lib, l'ho provato con il file .a nella directory corrente, ecc. Esiste una variabile d'ambiente che devo impostare? Se sì, come, ecc.

Ho provato una libreria completamente diversa (GMP) e ho avuto lo stesso problema. Questo deve essere una sorta di problema con l'ambiente di Ubuntu? Qualcuno ha qualche idea su come risolvere questo problema?

risposta

113

Il trucco qui è mettere la libreria DOPO il modulo che si sta compilando. Il problema è una cosa di riferimento. Il linker risolve i riferimenti nell'ordine, quindi quando la libreria è PRIMA che il modulo sia compilato, il linker viene confuso e non pensa che sia necessaria alcuna delle funzioni nella libreria. Inserendo la libreria DOPO il modulo, i riferimenti alla libreria nel modulo vengono risolti dal linker.

+7

+1 Oh, grazie! So che l'ordine di risoluzione dei link ha perfettamente senso, ma aiuta davvero a ricordare questi fatti! – scraimer

+1

Questo ha funzionato per me. Il mio vecchio makefile funzionava, ma ora sembra che il compilatore stia diventando troppo intelligente per il suo bene :) –

+2

Grazie, questo era un grande promemoria! –

35

Sì, è necessario aggiungere librerie dopo i file di origine/file di oggetti. Questo comando risolverà il problema:

gcc -static -L/usr/lib -I/usr/lib main.c -ltommath 
+1

+1 per scrivere il modo corretto di collegarsi a 'libtommath.a' – scraimer

+0

Wow, questo è abbastanza complicato. Grazie per la segnalazione. – lolski

4

Se i file di origine vengono convertiti .c cpp (come come in parsec), quindi l'extern deve essere seguito da "C" come in

extern "C" void foo(); 
Problemi correlati