提问人:johnydepp99 提问时间:12/9/2012 最后编辑:erikbstackjohnydepp99 更新时间:8/9/2013 访问量:6636
Python - 编译期间Py_Initialize未解析
Python - Py_Initialize unresolved during compilation
问:
我已经静态编译了 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
但是,发生了错误。海湾合作委员会声称著名的.undefined reference
test.c:(.text+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
我们可以看到,这在 pythonrun.o 中被正确引用。但是,我不知道编译器是如何选择正确的目标文件的。Py_Initialize
我的问题是:
- 我怎么能确定gcc在我的.a库中使用了正确的目标文件?
- 我的编译选项有什么问题吗?
感谢您的帮助。
答:
顺序很重要!更具体地说,gcc 参数的顺序很重要。更具体地说,如果一个对象使用库中的函数,那么顺序是有问题的,因为它没有理由让 gcc 在 中查找该函数。另一方面,当你使用时,gcc 知道你指的是什么,当它开始处理时,它会尝试解决依赖关系。这在 http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html 中很快被提及。通常,始终在对象之后指定库。bar
bluh
bleh
-lbleh bar.o
bluh
bleh
bar.o -lbleh
bluh
-lbleh
若要重现您的问题,请创建一个文件,如下所示: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
我正在使用 python 2.7 并在环境变量中设置 python 安装目录的路径。 我也使用boost 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
评论