前几天想做一个C++到python的一个接口,在网上查找资料发现可以使用SWIG进行配置,但是花了一天时间竟然一直也没配成功(无论是gcc手工配置 还是VS配置都失败了) 网上却搜索不到能使我完全配置成功且运行代码的教程。
今天沉下心来仔细配置了一下,发现了一个我认为是最快速、最简单的方法(Windows系统环境下)
本文使用的环境为目前最新环境配置(VS2022,python3.10,swigwin4.0.2)
实际上,不用最新环境配置过程类似,可以兼容
步骤分为简单的3步操作即可,不需要换python版本(只要python3就行)
我尽量使用最简短的描述 且配合图片的形式 将这一过程展现出来。
操作步骤
- 1.安装swig
- 2.配置VS项目
- 2.1 新建项目
- 2.2 在项目中添加C/C++代码
- 2.3 在项目中配置swig
- 2.4 VS进一步配置(关键步骤)
- 3.执行代码
- 4.可能的错误及解决方法
1.安装swig
首先下载swigwin:swigwin4.02.zip 下载后解压到任意一个盘
并且将swig添加到系统环境变量
配置过程如图所示
2.配置VS项目
2.1 新建项目
新建项目的时候选择向导,然后点新建dll,这样是为后续步骤最简略的一种新建方式。
2.2 在项目中添加C/C++代码
这里举一个简单的例子使用
/* jsample.h */
#ifndef JSAMPLE_H
#define JSAMPLE_H
//void cHelloWorld();
int compute(int a, int b);
#endif
/* jsample.cpp */
#include <iostream>
#include "jsample.h"
using namespace std;
int compute(int a, int b)
{
int temp = (a + b) * (a - b);
return temp;
}
执行到这一步骤 时你的项目情况应该如下图所示:
2.3 在项目中配置swig
配置swig需要用到.i 格式文件,在目录下新建jsample.i 文件,并且修改其中的代码为:
/* File : jsample.i */
%module jsample
%inline %{
#include "jsample.h"
%}
int compute(int a,int b);
然后在目录下执行
swig -c++ -python jsample.i
如果你是C语言,则执行
swig -c -python jsample.i
执行后生成了一个py文件以及一个cxx文件,py文件可以无视 甚至删除也行,保留cxx文件留作编译
执行完成后需要把cxx文件加入到项目中(关键步骤)之后你的项目应该如下图所示
有了这些基础后还需要进一步地进行VS配置
2.4 VS进一步配置(关键步骤)
2.1-2.3步骤几乎不会出错。但是我在2.4步骤一开始配置错了导致一直无法运行,所以2.4才是关键步骤
(1)在配置属性-高级中将目标文件扩展名改为.pyd
(2)在项目-属性将VC++目录中的包含目录改为python-include目录
将库目录改为python-libs目录(注意是libs不是Lib)
(3)然后关键来了,上图配置完成后还需要进行一个单独配置(网上90%教程均没写出这一个配置)
在链接器-输入里面,将附加依赖项添加python3.lib python310.lib(具体情况视你本机安装的python版本而定)
3.执行代码
上述代码编译后会生成一个文件,将其名字改为_jsample 以供导入
然后把这个.pyd文件和另外一个runme.py文件放在同一个文件夹(可以删除自动生成的jsample.py)
然后可以使用python调用jsample了,注意
如果你用了自动生成的jsample.py 则import jsample
如果你没有使用jsample.py 则像我一样import _jsample
import _jsample
print('this is the test running.\n')
aa = _jsample.compute(5,2)
print(aa)
然后运行代码即可,最终效果图
4.可能的错误及解决方法
如果你恰好遇到了和我一样的错误,可以看一下这里的解决方法
(1)Dll找不到指定的模块
注意到这个错误的原因是2.4步骤,需要在链接器加入附加项python3.lib和 python310.lib
(2)No module named 'xxx’
这是另外一种错误的可能,这种错误是目标文件夹下找不到这个文件,注意是文件名,如果你文件是A.py 或者A.pyd 就需要import A
PS:本文使用的环境为VS2022,而我搜索网上教程却发现网上很多人还在使用老版本,各种VS2015、VS2013等等,现在再次安利给大家VS2022,VS2022体积与VS2019几乎相当,但是各种兼容性方面都很好,而且也对新版SDK的适应性更强。现在不推荐的使用软件有(VC6.0、VS2008)
VC6.0唯一的优势在于对XP系统独一无二的兼容性,但是如果有一种方案可以对XP系统也能兼容,那么就可以不用VC6.0,现在确实发现有了一些不错的方法,我会在后续博客内容中指出。