2012-05-04 13 views
22

¿Qué podría estar mal aquí? Tengo la siguiente clase simple:referencia indefinida al símbolo incluso cuando nm indica que este símbolo está presente en la biblioteca compartida

#include "libmnl/libmnl.h" 

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

Y después de ejecutar un simple gcc de compilación (gcc -lmnl main.c) consigo los siguientes errores:

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

Operando nm en la biblioteca compartida muestra que es en realidad encontramos:

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

Esto está sucediendo en Ubuntu 12.04. Los paquetes libmnl-dev y libmnl0 están instalados. La salida de stracegcc indica que ld está utilizando exactamente eso * .so:

[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 

Respuesta

33

Las bibliotecas deben ser listadas después de que los objetos que los utilizan (más precisamente, una biblioteca se utilizará sólo si contiene un símbolo que satisface una referencia indefinida conocida en el momento en que se encuentra). Mueva el -lmnl al final del comando.

+0

Gracias, eso fue rápido. Supongo que en el pasado "accidentalmente" usé -l después del objeto, por lo que las cosas funcionaban bien hasta ahora. –

Cuestiones relacionadas