Python - 编译期间未解析的Py_Initialize

joh*_*p99 6 python gcc static-libraries unresolved-external

我已经静态编译了Python2.7而没有任何错误.要测试我的构建,我使用以下代码段:

#include "Python.h"
int main()
{
   Py_Initialize();
}
Run Code Online (Sandbox Code Playgroud)

我正在编译它:

$ 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
Run Code Online (Sandbox Code Playgroud)

但是,发生了错误.gcc声称着名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
Run Code Online (Sandbox Code Playgroud)

我们可以看到,Py_Initializepythonrun.o中正确引用了它.但是我不知道编译器如何选择正确的目标文件.

我的问题是:

  1. 我怎么能确定gcc在我的.a lib中使用了正确的目标文件?
  2. 我的编译选项有什么问题吗?

谢谢你的帮助.

mmg*_*mgp 7

订单很重要!更具体地说,gcc的参数中的顺序很重要.更具体地讲,如果一个bar对象使用一个函数bluh从库中bleh,那么该命令-lbleh bar.o是有问题的,因为它提供了无理由的gcc查找功能bluhbleh.另一方面,当你使用时,bar.o -lblehgcc知道你指的是什么bluh,当它处理-lbleh它时,它试图解决依赖.这在http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html上很快提到.通常,始终在对象之后指定库.

要重现您的问题,请创建一个文件,a1.c如下所示:

#include "Python.h"

int main()
{
    Py_Initialize();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在编译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和它的工作原理(忽略可能的许多警告,这是另一回事).