我有一个简单的程序来测试 python 开发文件的可用性:
#include<Python.h>
int main(){Py_Initialize(); Py_Finalize(); }
我将其编译(安装了 python 2.7)为gcc -I/usr/include/python2.7 -lpython2.7 p.c
。它在其他机器上工作得很好,除了在 Ubuntu 12.04 的大部分干净的 chroot 上(精确)我不断得到
/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
标头已安装,/usr/lib/libpython2.7.so
存在,但链接器仍然失败。该符号列在.so
文件,gcc 正在读取正确的内容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
有任何想法吗?
Try:
gcc -I/usr/include/python2.7 p.c -lpython2.7
链接器还不知道Py_Initialize
加载时是必需的符号libpython2.7.a
,所以它把它扔掉了。然后它到达 p.o,并对丢失的符号大发雷霆。以这种方式排序将使链接器在后续输入中查找丢失的符号。
See: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
在命令中编写此选项的位置会有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,foo.o -lz bar.o' searches library
z' 在文件 foo.o 之后但在 bar.o 之前。如果 bar.o 引用“z”中的函数,则可能不会加载这些函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)