Python的 - Py_Initialize编译期间未解决(Python - Py_Initia

2019-08-03 17:35发布

我已经静态编译Python2.7没有任何错误。 为了测试我的身材,我用下面的代码片段:

#include "Python.h"
int main()
{
   Py_Initialize();
}

而且我编译它是这样的:

$ gcc -static -I/path/to/python/header -L/path/to/my/staticpythonlib \ 
 -lpython2.7 -ldl -l_all_other_needed_lib /tmp/my_previous_snippet.c -o myouput

然而,发生错误。 GCC声称著名的undefined reference

test.c的:(文本+为0x1):未定义参照 'Py_Initialize'

奇怪的是我用gcc与冗长标志(我不会糊这里的结果),编译器说,它使用我的libpython,但无法找到参考。 所以,我把我的静态python2.7库的符号:

$ nm /path/to/pythonlib |grep Py_Initialize
frozenmain.o           U Py_Initialize
pythonrun.o  0000009e9 T Py_Initialize
pythonrun.o  000000052 T Py_Initialize_Ex
main.o                 U Py_Initialize

我们可以看到, Py_Initialize在pythonrun.o正确引用。 但是我不知道编译器如何选择正确的目标文件。

我的问题是:

  1. 我怎么能肯定,那GCC使用正确的对象文件在我的lib .A?
  2. 这有什么错我的编译选项?

谢谢你的帮助。

Answer 1:

订单事宜! 更具体地说,在参数海合会事项的顺序。 更具体地讲,如果一个bar对象使用一个功能bluh从库中bleh ,那么为了-lbleh bar.o是有问题的,因为它没有提供理由gcc的查找功能bluhbleh 。 在另一方面,当您使用bar.o -lbleh然后GCC知道你指的是bluh并且当它到达处理-lbleh它试图解决的依赖。 这是在迅速地提到http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html 。 作为一项规则,永远是你的对象后,指定库。

要重现你的问题,创建一个文件a1.c为:

#include "Python.h"

int main()
{
    Py_Initialize();
    return 0;
}

现在,随着编译gcc -static -I/usr/include/python2.7 -L/usr/lib/python2.7/config/ -lpython2.7 -ldl -lm -lutil -lz -pthread -o a1 a1.c 。 这使未定义的引用Py_Initialize 。 当然,你必须改变以匹配您的安装路径。

现在,而是编译gcc -static -I/usr/include/python2.7 -L/usr/lib/python2.7/config/ -o a1 a1.c -lpython2.7 -ldl -lm -lutil -lz -pthread和它的作品(忽略可能很多的警告,这是另一回事)。



Answer 2:

我使用Python 2.7版,并设置Python安装目录的环境变量的路径。 我也用升压1.5.0

按照步骤编译下面的代码

#include <python2.7/Python.h>
int main()
{
Py_Initialize();

PyRun_SimpleString("print \"Hello, world!\"");

Py_Finalize();
return 0;
}

运行命令: -

g++ hello.cc -lpython2.7
./a.out


文章来源: Python - Py_Initialize unresolved during compilation