版本通用——Win10系统使用SWIG封装C++(Python调用)(一)

前期准备:

已安装

Python 3.7.8-64bit(64bit的位数很重要),Visual Studio 2019 & C++,Visual Studio Code,SWIG-4.0.2

下载

SWIG可以在官网www.swig.org下载,解压后将swig.exe的路径添加到环境变量的path中,重启电脑即可使用swig

确认SWIG是否安装完成
win+R --> cmd --> 
>swig -help

安装成功
安装成功

C++代码准备

C++头文件

头文件主要包括:

#include调用(例如#include )
命名空间指定using namespace std;
函数和类的声明

//  example.h
#include <iostream>
using namespace std;

class example {
    private:
        int num;
    public:
        void say_hello(void);
        void change(int din);
        int get_num();
};
C++源文件

源文件为头文件中函数和类的实现

// example.cpp

#include "example.h"

void example::say_hello(void) {
    cout << "hello python,I am C++" << endl;
}

void example::change(int din) {
    num = din;
}

int example::get_num(void) {
    return num;
}

SWIG转换

编写封装说明文件

swig封装需要一个.i后缀文件的封装说明,将c++写得功能方法打包成扁平的接口

%module example
%{
#include "example.h"
%}
%include "example.h"

%module < name >为封装名称,Python通过这个名称加载程序
%{…%}为附加的函数说明和头文件,源文件以外的部分都要包括在这里,包括头文件和宏定义等
之后为要封装的函数或类,可以直接引用头文件(若已经将要封装的部分的声明写在头文件中)

调用swig封装

在命令行中输入swig -python -c++ < swig_config >.i,其中< swig_config >.i为上面写的说明文件

Win+R --> cmd --> cd 当前文件路径
>swig -python -c++ example.i

调用后生成两个文件:
< cpp_source >_wrap.cxx文件
< name >.py文件

模块打包

写一个setup.py文件,放到同一个文件夹下,将接口打包生成一个模块

#!/usr/bin/env python

"""
setup.py file for SWIG C++/Python example
"""
from distutils.core import setup, Extension
example_module = Extension('_example',
                           sources=['example.cpp', 'example_wrap.cxx',],
                           )
setup (name = 'example',
       version = '0.1',
       author      = "zc",
       description = """Simple swig C++/Python example""",
       ext_modules = [example_module],
       py_modules = ["example"],
       )

注:这里看到很多人用VS去导出C++的动态链接库,但是自己一直没有成功,要不就是VS生成解决方案失败,要不就是Python调用失败。好像是编译器版本问题,但搜索了很多网页也没有解决,最后看到这个模块打包的方法,可行了就不再在VS上折腾了,又不是真的搞底层的。
运行:

Win+R --> cmd -->cd 当前文件路径
>python setup.py build_ext --inplace

得到一个文件:_example.<python版本号>.pyd
改成:_example.pyd

测试

在当前文件夹中新建一个test.py


print("hello world")
print("hello world")
import example

a = example.example()
a.say_hello()

a.change(3)
print(a.get_num())

输出结果:
在这里插入图片描述
但是!这个方法只能将一个cpp转成python扩展包,用这种方法没法儿将多个cpp文件转成cpp各文件内部可互相调用的由一个主cpp负责被调用的python扩展包,linux系统下用的makefile这边也行不通,摸索了很久,最后通过VS配置成功导出,请看(二)。

参考链接

https://www.jianshu.com/p/a257e630fe42
https://blog.csdn.net/qq_42004289/article/details/90634739
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值