使用从 SWIG 生成的 python 文件时出错(从 C++ 生成)
Posted
技术标签:
【中文标题】使用从 SWIG 生成的 python 文件时出错(从 C++ 生成)【英文标题】:Error while using python file generated from SWIG (generated from C++) 【发布时间】:2020-02-13 08:56:11 【问题描述】:我有一个 .cpp(称为 trial.cpp)文件,如下:
#include "trial.hpp" int main() cout << "hello"; return 0;
我的头文件(trial.hpp)是:
#include <iostream> using namespace std;
我有一个 .i 文件 (trial.i),如下所示:
%module trial % #include "trial.hpp" % %include trial.hpp
我在 cmd 中以如下方式使用 SWIG 生成 .pyd、.py、.o 和 .cxx 文件:
swig -c++ -python trial.i
g++ -c trial_wrap.cxx -I C:\Users.....Python\Python37\include
g++ -shared trial_wrap.o -o _trial.pyd -L C:\用户.....\Python\Python37\libs -l python37
文件生成成功
但是,当我打开 Python 命令提示符并运行以下命令时:
从试用导入 *
main()
我收到一个错误提示
Traceback(最近一次通话最后一次):
文件“
”,第 1 行,在 NameError: name 'main' 未定义
我该如何解决这个问题?
此外,如果我使用另一个函数名(比如 fn1())而不是 main(),则会在第三个命令中收到以下错误:
g++ -shared trial_wrap.o -o _trial.pyd -L C:\Users.....\Python\Python37\libs -l python37
错误是:
对 fn1() 的未定义引用
我想用 fn1() 代替 main()
我该如何解决这个问题?
【问题讨论】:
我对 swig 一无所知,但main
在 C++ 中很特别。尝试使用另一个函数名并在标题中声明它(并删除那个using namespace std;
,它会造成比少数保存的击键更有价值的伤害)
当我尝试使用另一个函数名(我们称之为 fn1())并在标题中提供定义时,我在尝试运行第三条语句时收到一条错误消息,提示“未定义对 fn1() 的引用在问题中提到的 SWIG 中'
你的头文件没有声明你要包装的函数,所以它不会被包装。
不,这不是真的。 “%include trial.hpp”告诉 SWIG 包装所有可用函数
【参考方案1】:
修好了!
改用这三个语句:
swig -c++ -python trial.i
g++ -c trial_wrap.cxx trial.cpp -I C:\Users\ngoyal\AppData\Local\Programs\Python\Python37\include
g++ -shared -o _trial.pyd trial.o trial_wrap.o -L C:\Users\ngoyal\AppData\Local\Programs\Python\Python37\libs -l python37
还必须将 main() 更改为非保留函数名,并在头文件中给出函数定义。
【讨论】:
以上是关于使用从 SWIG 生成的 python 文件时出错(从 C++ 生成)的主要内容,如果未能解决你的问题,请参考以下文章
CMake 有没有办法利用“swig -MM”生成的依赖项?
在使用许多 SWIG 生成的模块时避免重复的 SWIG 样板