GCC e ld non riescono a trovare i simboli esportati & # 8230; ma sono lì
-
03-07-2019 - |
Domanda
Ho una libreria C ++ e un'applicazione C ++ che cercano di utilizzare funzioni e classi esportate dalla libreria. La libreria funziona bene e l'applicazione si compila ma non riesce a collegarsi. Gli errori che ottengo seguono questo modulo:
app-source-file.cpp :(. text + 0x2fdb): riferimento indefinito a `lib-namespace :: GetStatusStr (int) '
Le classi nella libreria sembrano essere risolte bene dal linker, ma funzioni libere e dati esportati (come una tabella di ricerca del coseno) causano invariabilmente l'errore sopra.
Sto usando Ubuntu 8.04 (Hardy) ed è aggiornato con gli ultimi pacchetti Ubuntu.
Il comando per collegare la libreria è (con altre librerie rimosse):
g++ -fPIC -Wall -O3 -shared -Wl,-soname,lib-in-question.so -o ~/project/lib/release/lib-in-question.so
Il comando per collegare l'applicazione è (con altre librerie rimosse):
g++ -fPIC -Wall -O3 -L~/project/lib/release -llib-in-question -o ~/project/release/app-in-question
Infine, sembra (per quanto posso dire) che i simboli in questione vengono esportati correttamente:
nm -D ~/project/lib/release/lib-in-question.so | grep GetStatusStr --> U _ZN3lib-namespace12GetStatusStrEi
Soluzione
la U prima di _ZN3lib-namespace12GetStatusStrEi nell'output nm mostra che il simbolo è indefinito nella libreria.
Forse è definito nello spazio dei nomi sbagliato: sembra che tu lo stia chiamando in lib-namepace ma potresti definirlo in un altro.
Altri suggerimenti
È passato un po 'di tempo, ma se si specifica una lib con l'opzione -l, allora non si ha il prefisso lib da saltare?
(Ho cambiato il nome da " lib-in-question.so " a " libfoobar.so " per una lettura più semplice nell'esempio seguente)
g++ -fPIC -Wall -O3 -L~/project/lib/release -lfoobar
o
g++ -fPIC -Wall -O3 ~/project/lib/release/libfoobar.so