lj8*_*888 8 c++ python swig gcc
我无法在Windows上重现基本的SWIG示例.我的错误在SWIG文档中说明,我确信我会提到他们提到的2个修复程序.对于此错误:
>>> import example
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "example.py", line 2, in ?
import _example
ImportError: No module named _example
Run Code Online (Sandbox Code Playgroud)
SWIG文件明确指出:
忘记前导下划线(_).
忘记前导下划线(_).>如果你收到这条消息,就意味着
您忘记将包装器代码编译到扩展模块中,或者您没有为扩展模块提供正确的名称.确保将包装器编译为名为example.so的模块.并且不要忘记前导下划线().忘记前导下划线(_).
我确信我链接了最新的包装对象构建,我试过:"_ example","_ example.so","example.dll","example.so","example.dll",甚至一次性,并且生成的"example.py"与共享库位于同一文件夹中,并且python路径包含此目录,并保留前导下划线().
这个例子:
//example.h
int foo_sum(int a, int b);
Run Code Online (Sandbox Code Playgroud)
.
//example.cpp
int foo_sum(int a, int b) {
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
.
//example.i
%module example
%{
#include "example.h"
%}
#include "example.h
Run Code Online (Sandbox Code Playgroud)
和构建命令:
gcc -IV:\temp\example\external\include\Python -O3 -Wall -c -fmessage-length=0 -oexample_wrap.o ..\example_wrap.c
g++ -IV:\temp\example\external\include\Python -O3 -Wall -c -fmessage-length=0 -oexample.o ..\example.cpp
g++ -LV:\temp\example\external\lib -shared -oexample.dll example_wrap.o example.o -lpython26
Run Code Online (Sandbox Code Playgroud)
即使我不使用-O3它仍然不起作用(我从发布配置粘贴构建命令)
我也试过这个并没有成功:
>>> import sys
>>> sys.path.append("/your/module/path")
>>> import example
Run Code Online (Sandbox Code Playgroud)
编辑:
显然,如果你将它重命名为"_example.pyd",它会加载dll,但加载的模块不包含我的"foo_sum"函数
编辑:它现在工作,我使用extern"C"并且不包括.i文件中的标题
我发现你必须在 Windows 上将 C++ 生成的库文件从 .dll 重命名为 .pyd。我不记得你是否需要在苹果上重命名它。并且你想要暴露给 python 的函数必须在其前面有 extern "C" 。否则,编译器不会使该函数可以在库外部访问。另外,如果我记得如果你想在 python 中使用它们,你需要将返回值包装在 Py_value 中。