如何正确设置python/c库?
我一直在尝试让Python和C的库能和我的mingW编译器配合使用。Python的在线文档提到,我需要引入一个叫做python.h的文件。我从安装目录里找到了这个文件(在Windows平台上是必须的),然后通过编译下面这行代码来测试:
#include "Python.h"
。这行代码编译得很顺利。接着,我又试了一段在Python/C API页面上稍微低一点的代码:
PyObject *t;
t = PyTuple_New(3);
PyTuple_SetItem(t, 0, PyInt_FromLong(1L));
PyTuple_SetItem(t, 1, PyInt_FromLong(2L));
PyTuple_SetItem(t, 2, PyString_FromString("three"));
奇怪的是,如果我把最后四行代码删掉(只留下pyObject变量的定义),编译器就能正常编译这些代码,但当我尝试调用元组的构造函数时却出现了错误。
我可能遗漏了一些非常明显的东西,因为我对C语言还很陌生,但有没有人知道这是怎么回事呢?
2 个回答
我在问问题后有了一些进展,想分享一下,希望能帮助到遇到类似问题的人。
我遇到的错误是:
In function `main':
undefined reference to `_imp__PyTuple_New'
undefined reference to `_imp__PyInt_FromLong'
undefined reference to `_imp__PyTuple_SetItem'
undefined reference to `_imp__PyInt_FromLong'
undefined reference to `_imp__PyTuple_SetItem'
undefined reference to `_imp__PyString_FromString'
undefined reference to `_imp__PyTuple_SetItem'
这些错误是因为mingW编译器缺少一些库文件。仅仅在源代码中包含头文件是不够的,还需要一个特殊的文件(.lib, .o, .a等)来进行编译。你可以在mingW的命令行中使用 -l[path] 这个选项,但我发现使用Code::Blocks(http://www.codeblocks.org/)会更方便。在创建项目后,进入项目 > 构建选项,你可以在链接器设置标签下指定库文件的位置。完成后,构建项目,希望它能正常工作。
希望有类似问题的人能从中得到帮助 :)
我在网上查了一些资料,如果你在链接阶段遇到错误(错误信息里可能有十六进制字符串或者提到ld
),你可能需要确认一下Windows版本的Python库是否已经转换成GCC(MinGW)能读取的格式;可以参考这里,还有其他一些网站。另外,确保GCC能够找到并使用这个库文件,如果需要的话,可以用-L/my/directory
和-lpython26
(根据你的路径和Python版本进行替换)。
如果错误出现在编译阶段(如果错误信息里有行号),那么要确保你没有遗漏其他需要添加到包含搜索路径的目录。Python可能会在Python.h
中包含其他头文件,而这些文件可能存放在其他目录里。如果是这样的话,可以用-I/my/directory/
这个标志告诉GCC去那个目录搜索。
如果能提供准确(复制粘贴)的错误信息,那会更有帮助。
警告: 以下内容并没有回答问题!
你把代码放在了一个函数里吗?试着把它放在main
里,像这样:
int main(int argc, char *argv[]) {
PyObject *t;
t = PyTuple_New(3);
PyTuple_SetItem(t, 0, PyInt_FromLong(1L));
PyTuple_SetItem(t, 1, PyInt_FromLong(2L));
PyTuple_SetItem(t, 2, PyString_FromString("three"));
return 0;
}
这段代码会在程序执行时运行。然后你可以使用其他提供的方法来检查元组的内容。如果不打算单独作为可执行程序运行,那就放在一个不同名字的方法里;我想你有其他方式来调用这个函数。
PyObject *t;
的定义在函数外部是有效的,作为全局变量定义,同时在函数内部也可以作为局部变量声明。其他四行是函数调用,必须放在另一个函数里面。
以上代码单独并不能构成一个程序。你是在尝试为Python编写C扩展吗?如果是的话,可以查看一些更完整的文档,这里有相关信息。