2012-05-04 2 views
22

Cosa potrebbe esserci di sbagliato qui? Ho il seguente semplice classe:riferimento indefinito al simbolo anche quando nm indica che questo simbolo è presente nella libreria condivisa

#include "libmnl/libmnl.h" 

int main() { 
    struct mnl_socket *a = mnl_socket_open(12); 
} 

E dopo l'esecuzione di una semplice gcc compilazione (gcc -lmnl main.c) ottengo i seguenti errori:

/tmp/cch3GjuS.o: In function `main': 
main.c:(.text+0xe): undefined reference to `mnl_socket_open' 
collect2: ld returned 1 exit status 

nm sulla libreria condivisa in corso dimostra che è effettivamente trovato:

[email protected]:/tmp$ nm -D /usr/lib/libmnl.so | grep mnl_socket_open 
0000000000001810 T mnl_socket_open 

Questo sta accadendo su Ubuntu 12.04. I pacchetti libmnl-dev e libmnl0 sono installati. L'uscita del stracegcc indica che ld sta utilizzando esattamente questo * .so di file:

[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.so", 0x7fff2a39b470) = -1 ENOENT (No such file or directory) 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.so", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.a", 0x7fff2a39b4d0) = -1 ENOENT (No such file or directory) 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.a", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.so", 0x7fff2a39b470) = -1 ENOENT (No such file or directory) 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.so", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.a", 0x7fff2a39b4d0) = -1 ENOENT (No such file or directory) 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.a", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libmnl.so", {st_mode=S_IFREG|0644, st_size=18608, ...}) = 0 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libmnl.so", O_RDONLY) = 7 

risposta

33

biblioteche devono essere incluso dopo che gli oggetti che ne fanno uso (più precisamente, una biblioteca saranno utilizzati solo se contiene un simbolo che soddisfa un riferimento indefinito noto al momento in cui viene rilevato). Spostare -lmnl alla fine del comando.

+0

Grazie, è stato veloce. Immagino che in passato io abbia "accidentalmente" usato -l dopo l'oggetto, quindi le cose funzionavano bene fino ad ora. –