我已经静态编译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正确引用。 但是我不知道编译器如何选择正确的目标文件。
我的问题是:
- 我怎么能肯定,那GCC使用正确的对象文件在我的lib .A?
- 这有什么错我的编译选项?
谢谢你的帮助。
订单事宜! 更具体地说,在参数海合会事项的顺序。 更具体地讲,如果一个bar
对象使用一个功能bluh
从库中bleh
,那么为了-lbleh bar.o
是有问题的,因为它没有提供理由gcc的查找功能bluh
中bleh
。 在另一方面,当您使用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
和它的作品(忽略可能很多的警告,这是另一回事)。
我使用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