12

我有一个简单的程序来测试 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

有任何想法吗?

4

4 回答 4

25

尝试:

gcc -I/usr/include/python2.7 p.c -lpython2.7 

Py_Initialize链接器在加载时还不知道这是一个必需的符号libpython2.7.a,所以它把它扔掉了。然后它到达 po 并抛出一个关于丢失符号的适合。以这种方式排序将使链接器在后续输入中查找丢失的符号。

见: http: //gcc.gnu.org/onlinedocs/gcc/Link-Options.html

在命令中编写此选项的位置有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,foo.o -lz bar.o' searches libraryz' 在文件 foo.o 之后但在 bar.o 之前。如果 bar.o 引用了 `z' 中的函数,这些函数可能不会被加载。

于 2012-12-19T12:04:27.017 回答
11

我也遇到了同样的链接问题。但就我而言,仅提供-lpython. 也-L需要。IE

g++ -I/usr/include/python3.5 hw.cpp -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5

是的。订单很重要。

于 2017-01-12T14:51:50.400 回答
0

我遇到了同样的链接问题,我个人的问题是我的 32 位 mingw 编译器无法加载 64 位 python 库。我将我的 mingw 升级到 64 位并解决了我的问题。在这里留下一个便条,以防有人遇到同样的问题。

于 2016-07-17T23:45:03.863 回答
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的时候,其实就是编译选项。

于 2019-05-28T15:43:57.940 回答