linker - error - undefined reference to class
Referencia indefinida: a pesar de que lib encuentre al enlazador (3)
Tengo un programa trivial para probar la disponibilidad de los archivos de desarrollo de Python:
#include<Python.h>
int main(){Py_Initialize(); Py_Finalize(); }
Lo compilo (con python 2.7 instalado) como gcc -I/usr/include/python2.7 -lpython2.7 pc
. Funciona bien en otras máquinas, excepto que en el chroot mayormente limpio de Ubuntu 12.04 (preciso) sigo recibiendo
/tmp/ccj8Mgjb.o: In function `main'':
p.c:(.text+0x5): undefined reference to `Py_Initialize''
p.c:(.text+0xa): undefined reference to `Py_Finalize''
collect2: ld returned 1 exit status
Los encabezados están instalados, /usr/lib/libpython2.7.so
pero el enlazador falla. El símbolo aparece en el archivo .so
y gcc está leyendo el libpython2.7.so
correcto:
$ nm -D libpython2.7.so.1.0 | grep Py_Initialize
00000000000c9c20 T Py_Initialize
00000000000c9260 T Py_InitializeEx
$ strace -f gcc -I/usr/include/python2.7 -lpython2.7 /tmp/p.c 2>&1 |grep libpython2.7 |grep open
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libpython2.7.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libpython2.7.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libpython2.7.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libpython2.7.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libpython2.7.so", O_RDONLY) = 7
¿Algunas ideas?
Tratar:
gcc -I/usr/include/python2.7 p.c -lpython2.7
el enlazador aún no sabe que Py_Initialize
es un símbolo obligatorio cuando carga libpython2.7.a
, por lo que lo descarta. Y luego llega a po y arroja un ajuste sobre el símbolo que falta. Si lo ordena de esta manera, el vinculador buscará el símbolo que falta en las entradas siguientes.
Ver: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
Hace una diferencia dónde en el comando escribes esta opción; el vinculador busca y procesa bibliotecas y archivos de objetos en el orden en que se especifican. Por lo tanto,
foo.o -lz bar.o'' searches library
z'' después del archivo foo.o pero antes de bar.o. Si bar.o se refiere a funciones en `z '', esas funciones pueden no cargarse.
Encontré el mismo problema de vinculación y, personalmente, mi problema era que mi compilador mingw de 32 bits no puede cargar la biblioteca de Python de 64 bits. Actualizo mi mingw a 64 bit y resolví mi problema. Dejó una nota aquí en caso de que alguien novato se metiera en el mismo problema.
Encontré el mismo problema de vinculación también. Pero en mi caso no fue suficiente para proporcionar -lpython
. También -L
era necesario. Es decir
g++ -I/usr/include/python3.5 hw.cpp -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5
Y si. El orden importa