使用从 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 生成的代码链接到错误的 python 安装

没有 DLL 的 SWIG + Python

在使用许多 SWIG 生成的模块时避免重复的 SWIG 样板

如何将复数从 python numpy 传递给 c(目前正在尝试使用 SWIG)

如何使用 swig 将 const 字符串参数从 perl 传递到 c++