SWIG - python 中的 C++ 代码
Posted
技术标签:
【中文标题】SWIG - python 中的 C++ 代码【英文标题】:SWIG - C++ code in python 【发布时间】:2018-05-24 12:32:10 【问题描述】:我尝试导入 SWING 生成的模块,但出现 ImportError:
>>> import ava
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "ava.py", line 28, in <module>
_ava = swig_import_helper()
File "ava.py", line 24, in swig_import_helper
_mod = imp.load_module('_ava', fp, pathname, description)
ImportError: ./_ava.so: undefined symbol: _Z7turn_aiPPiiii
>>>
我遵循 SWIG 的教程 (http://www.swig.org/tutorial.html) 并像这样编译了我的 main.cpp:
swig -python -c++ ava.i
c++ -fPIC -c ava_wrap.cxx -I/usr/include/python2.7/
c++ -shared ava_wrap.o -o _ava.so
我试图将我的函数外部化到 c:
extern "C"
bool isEnd(int** t, int x, int y, int K, int J);
void tout(int** t, int K);
koord turn(int** t, int player, int K, int J);
koord turn_ai(int** t, int player, int K, int J);
bool isPat(int** t, int K);
ai_res turn_ai_3x3_v2(int** t, int turn);
ai_res turn_ai_pre(int** t, int turn, int K, int J, int dep);
ai_res turn_ai_(int** t, int turn, int K, int J, int ab, int dep);
bool isSeparated(int** t, int K, int i, int j);
std::vector<koord> stepsFun(int** t, int K);
bool isEmpty(int** t, int K);
int value(int** t, int K);
int fofug();
【问题讨论】:
现在我将我的 ava.i 从/* ava.i */ %module ava % /* Put header files here or function declarations like below */ #include "koord.h" extern koord turn_ai(int** t, int player, int K, int J); % %include "koord.h" extern koord turn_ai(int** t, int player, int K, int J);
修改为 /* ava.i */ %module ava % /* Put header files here or function declarations like below */ #include "koord.h" extern "C" koord turn_ai(int** t, int player, int K, int J); % %include "koord.h" extern "C" koord turn_ai(int** t, int player, int K, int J);
但是还是一样的错误,只是结尾现在是undefined symbol: turn_ai
【参考方案1】:
问题在于c++
命令。您的 _ava.so
包含 SWIG 包装器,但缺少 turn_ai
等的实现。
仔细查看 SWIG 教程,有 example.c
和 example.o
包含 fact
、my_mod
等的实现。
【讨论】:
以上是关于SWIG - python 中的 C++ 代码的主要内容,如果未能解决你的问题,请参考以下文章
使用 SWIG 控制器将 python 中的 numpy 函数传递给 C++
Python 错误:在 SWIG 生成的 C++ 模板代码模块中未定义构造函数
将 python 函数传递给 SWIG 包装的 C++ 代码