3
#include <Python.h>

static PyObject* helloworld(PyObject* self)
{
    return Py_BuildValue("s", "Hello, Python extensions!!");
}

static char helloworld_docs[] =
    "helloworld( ): Any message you want to put here!!\n";

static PyMethodDef helloworld_funcs[] = {
    {"helloworld", (PyCFunction)helloworld, 
     METH_NOARGS, helloworld_docs},
    {NULL}
};

void inithelloworld(void)
{
    Py_InitModule3("helloworld", helloworld_funcs,
                   "Extension module example!");
}

我一直在尝试用 C 扩展 Python,因此一直在尝试在 Visual Studio 中编译上述代码。但是,我反复收到以下错误:

LINK : fatal error LNK1104: cannot open file 'python27.lib'

将 python27.lib 添加到项目后,我收到以下错误:

HiWorld.obj : error LNK2001: unresolved external symbol __imp__Py_BuildValue
HiWorld.obj : error LNK2001: unresolved external symbol __imp__Py_InitModule4

我已经坚持了很长一段时间,非常感谢任何建议。

4

2 回答 2

0

这是一个链接问题,最常见的错误是忘记了 Release 配置文件和 Debug 配置文件使用不同的符号集,因此只能成功链接到不同版本的库;这意味着在 Debug 模式下您应该提供library-debugVersion.lib并在 Release 中library.lib

我也不会过多地使用 Visual Studio,但我认为将我经常需要的所有库放在公共文件夹中会更方便,C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\这样无论单个项目的设置如何,VS 都可以自动为您找到正确的库.

于 2012-09-09T21:22:35.597 回答
0

假设您的代码是正确的,使其工作的最佳方法是使用setup.py文件。例如,这是我在创建 hello world 模块时使用的代码:

设置.py:

from distutils.core import setup, Extension

setup(
    ext_modules = [
        Extension("ext1", sources=["ext1.c"]),
   ],
)

在这里,"ext1"将替换您的模块名称,而 '"ext1.c"' 将替换您的 C 源文件的名称。

然后你从这样的终端运行它:

setup.py install

仅供参考,这是我的 C 源代码:

ext1.c:

#include "Python.h"

static PyObject *
hello_world(PyObject * self, PyObject * args)
{
    return Py_BuildValue("s", "Hello World!");
}

static PyMethodDef
module_functions[] = {
    { "hello_world", hello_world, METH_VARARGS, "Says Hello World."},
    { NULL }
};

void
initext1(void)
{
    Py_InitModule3("ext1", module_functions, "My additional Module");
}
于 2012-09-09T21:16:55.843 回答