我有一个简单的程序来测试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
有什么想法吗?
答案 0 :(得分:18)
尝试:
gcc -I/usr/include/python2.7 p.c -lpython2.7
链接器在加载Py_Initialize
时还不知道libpython2.7.a
是必需的符号,因此将其抛弃。然后它到达p.o并抛出关于缺失符号的拟合。以这种方式排序将让链接器在后续输入中查找丢失的符号。
请参阅:http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
在您编写此选项的命令中,它会有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,在文件foo.o之后但在bar.o之前
foo.o -lz bar.o' searches library
z'。如果bar.o引用“z”中的函数,则可能无法加载这些函数。
答案 1 :(得分:5)
我也遇到了相同的链接问题。
但就我而言,提供-lpython
是不够的。还需要-L
。即。
g++ -I/usr/include/python3.5 hw.cpp -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5
是的。订单很重要。
答案 2 :(得分:0)
我遇到了相同的链接问题,我个人的问题是我的32位mingw编译器无法加载64位python库。我将我的mingw升级到64位并解决了我的问题。如果新手遇到同样的问题,请留下这里的注释。
答案 3 :(得分:0)
如果已安装python 3.x,则此命令可以正常工作:
g++ hw.cpp `/usr/bin/python3-config --cflags` `/usr/python3-config --ldflags`
顺便说一句,您应该检查一下gcc和python版本。
据我所知,如果gcc版本是5.4,而python版本是3.7,则它不起作用。(python 3.5是有效的)
实际上,当您运行/usr/bin/python3-config --cflags
时,它是编译选项。