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