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!");
}

私はPythonをCで拡張しようとしており、その結果、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 モジュールを作成したときに使用したコードは次のとおりです。

setup.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 に答える