Mam trywialny program do testowania dostępność plików rozwoju Pythona:Niezdefiniowany odniesienia - mimo lib znajdowane przez łącznik
#include<Python.h>
int main(){Py_Initialize(); Py_Finalize(); }
skompilować go (z Pythona 2.7 zainstalowany) jako gcc -I/usr/include/python2.7 -lpython2.7 p.c
. To działa dobrze na innych maszynach, poza tym, że w większości-czystą chroot Ubuntu 12.04 (precyzyjnego) ciśgle są zainstalowane
/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
Główki, /usr/lib/libpython2.7.so
istnieje, ale mimo to nie łącznik. Symbol jest wymieniony w pliku .so
i gcc czyta prawo libpython2.7.so
:
$ 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
pomysłów?
Dzięki, to zadziałało! Nowe rzeczy się nauczyły. – eudoxos
Czy masz jakiś pomysł, dlaczego działa on na inne maszyny? Czy to zachowanie zależne od wersji? – eudoxos
To zależy od linkera, który jest używany, jak sądzę. Ale jeśli ją położysz, to zawsze będzie działać. – yiding