studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones linux gcc linker shared-libraries

linux - programacion - referencia indefinida al símbolo incluso cuando nm indica que este símbolo está presente en la biblioteca compartida



manual de programacion android pdf (1)

Las bibliotecas deben enumerarse después de los objetos que las usan (más precisamente, una biblioteca se usará solo si contiene un símbolo que satisfaga una referencia indefinida conocida en el momento en que se encuentra). Mueve el -lmnl al final del comando.

¿Qué podría estar mal aquí? Tengo la siguiente clase simple:

#include "libmnl/libmnl.h" int main() { struct mnl_socket *a = mnl_socket_open(12); }

Y después de ejecutar una compilación gcc simple ( gcc -lmnl main.c ) obtengo 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

La ejecución de nm en la biblioteca compartida muestra que realmente se encuentra:

aatteka@aatteka-Dell1:/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 strace de gcc indica que ld está usando exactamente ese archivo * .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