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.cexample.o 包含 factmy_mod 等的实现。

【讨论】:

以上是关于SWIG - python 中的 C++ 代码的主要内容,如果未能解决你的问题,请参考以下文章

使用 SWIG 控制器将 python 中的 numpy 函数传递给 C++

Swig C++ python 包装文件解释?

Python 错误:在 SWIG 生成的 C++ 模板代码模块中未定义构造函数

将 python 函数传递给 SWIG 包装的 C++ 代码

在 Windows 中为 python 编译 SWIG 包装器

如何使用 SWIG 将 C++ 数组转换为 Python 列表?