2012-05-04 7 views
22

Was könnte hier falsch sein? Ich habe die folgende einfache Klasse:undefinierter Verweis auf Symbol, auch wenn nm angibt, dass dieses Symbol in der gemeinsam genutzten Bibliothek vorhanden ist

#include "libmnl/libmnl.h" 

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

Und nach einer einfachen gcc Kompilierung läuft (gcc -lmnl main.c) Ich nehme die folgenden Fehlermeldungen erhalten:

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

Lauf nm auf der gemeinsam genutzten Bibliothek zeigt, dass es tatsächlich gefunden hat:

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

Dies geschieht auf Ubuntu 12.04. Die Pakete libmnl-dev und libmnl0 sind installiert. Die strace Ausgabe von gcc zeigt an, dass ld verwendet genau die * .so-Datei:

[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 

Antwort

33

Bibliotheken müssen nach den Objekten aufgelistet werden, die sie verwenden (genauer gesagt, eine Bibliothek wird nur verwendet, wenn es ein Symbol enthält, erfüllt eine undefinierte Referenz, die zum Zeitpunkt des Auftretens bekannt ist). Verschieben Sie die -lmnl an das Ende des Befehls.

+0

Vielen Dank, das war schnell. Ich glaube, in der Vergangenheit habe ich "zufällig" -l nach dem Objekt benutzt, also funktionierte es bis jetzt gut. –

Verwandte Themen