所以,我正在尝试进行最简单的结构访问……但我做不到。
yoba.h:
typedef struct{
int bar;
} foo;
yoba.i:
%module yoba
%{
#define SWIG_FILE_WITH_INIT
#include "yoba.h"
%}
%include "yoba.h"
设置.py:
import distutils
from distutils.core import setup, Extension
setup(
name = "yoba",
version = "0.00",
ext_modules = [Extension(
"_yoba",
["yoba.i"],
swig_opts=['-py3', '-c++', '-module','yoba'],
)]
)
运行.bat:
python setup.py build_ext --inplace -ccygwin
pause
所以,我得到了这样的输出:
D:\pro\py\mod-test>python setup.py build_ext --inplace -ccygwin
running build_ext
building '_yoba' extension
swigging yoba.i to yoba_wrap.cpp
D:\tools\cygwin\bin\swig.exe -python -py3 -c++ -module yoba -o yoba_wrap.cpp yoba.i
D:\tools\cygwin\bin\gcc.exe -mcygwin -mdll -O -Wall -ID:\tools\python3.2\include -ID:\tools\python3.2\PC -c yoba_wrap.cpp -o build\temp.win32-3.2\Release\yoba_wrap.o
writing build\temp.win32-3.2\Release\_yoba.def
D:\tools\cygwin\bin\g++.exe -mcygwin -shared -s build\temp.win32-3.2\Release\yoba_wrap.o build\temp.win32-3.2\Release\_yoba.def -LD:\tools\python3.2\libs -LD:\tools\python3.2\PCbuild -lpython32 -lmsvcr90 -o D:\pro\py\mod-test\_yoba.pyd
一切看起来都很好,但是当我尝试执行这样的代码时:
import yoba
f = yoba.foo()
什么都没有发生,我用“工作”的 Python 获得了 100% 的 cpu 负载。欢迎任何想法。
添加:
所以,我正在尝试确定“损坏”的代码。我很困惑……它在_wrap_new_foo中,由 swig 生成。
SWIGINTERN PyObject *_wrap_new_foo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
foo *result = 0 ;
if (!PyArg_ParseTuple(args,(char *)":new_foo")) SWIG_fail;
result = (foo *)new foo();
resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_foo, SWIG_POINTER_NEW | 0 );
return resultobj;
fail:
return NULL;
}
在线上:
result = (foo *)new foo();
怎么回事!他妈的?
解决了:
使用 -cmingw32 代替 -ccygwin。不明白,但它有效。