发布于2021-07-25 07:52 阅读(1085) 评论(0) 点赞(26) 收藏(5)
1. Windows下安装Swig
详情参考 https://blog.csdn.net/aganliang/article/details/91129379
2. 新建test.cpp文件
- #include "test.h"
-
- int addReturnInt(int a, int b)
- {
- return a + b;
- }
-
- void addPointerDouble(double& a, double& b, double& res)
- {
- res = a + b;
- }
新建test.h文件
- #ifndef TEST_H
- #define TEST_H
-
- int addReturnInt(int a, int b);
-
- #ifdef SWIG
- %apply double& INPUT{ double& a }
- %apply double& INPUT{ double& b }
- %apply double& INOUT{ double& res }
- #endif
- void addPointerDouble(double & a, double & b, double & res);
-
- #endif
新建test.i文件
- %module TestSwig
- %{
- #include "test.h"
- %}
- %include "test.h"
将这三个新建的文件放入一个文件夹中
3. 打开cmd命令行 cd进刚刚创建的文件夹内
执行swig命令
swig -c++ -python test.i
执行完毕后,会在当前目录下生成一个名为test_wrap.cxx的文件以及TestSwig.py文件
4. 打开VS,新建一个C++空项目(控制台)
在菜单栏(正上方)设置为release x86, 将cxx文件,h文件,cpp文件添加进项目中
5. python环境配置:
6. VS编译项目,点击生成选项,会在配置的输出目录中生成TestSwig.pyd文件。生成完毕之后将此文件重命名为_TestSwig.pyd(原因:与刚刚swig生成的py文件重名了,不利于调用)
7. 将pyd文件与生成的py文件放在同一个目录下
执行测试代码:
- import TestSwig
-
- a = 1
- b = 2
- res = TestSwig.addReturnInt(a, b)
- print('原生C++ int 返回:', type(res), res)
-
- print('-------------------------')
-
- a1 = 1.0
- a2 = 2.0
- res = 0.0
-
- # 这里的res是通过swig编译脚本里的INOUT关键字返回
- res = TestSwig.addPointerDouble(a1, a2, res) 的
- print('原生C++ double 引用返回:', type(res), res)
-
执行结果:
原生C++ int 返回: <class 'int'> 3
-------------------------
原生C++ double 引用返回: <class 'float'> 3.0
至此,python就可以调用c++封装的函数了
总结:
test.h中的swig宏是解决python类型中没有double类型返回的关键
- #ifdef SWIG
- %apply double& INPUT{ double& a }
- %apply double& INPUT{ double& b }
- %apply double& INOUT{ double& res }
- #endif
-
- 其中:% 与apply不能分离(这个巨坑,别问我怎么知道的)
- 参数与函数保持一致,如果函数入参为int这种非引用、指针类型的,可以不写入SWIG宏内
- INPUT代表输入输出,编译后的python得出结果需要返回(因为python没有显式的使用指针)
- OUTOUT代表输出,只能在python内return出结果
- INPUT代表输入,只能通过python赋值给C++函数参数
原文链接:https://blog.csdn.net/ws18921818762/article/details/119042239
作者:小可爱不要爱
链接:http://www.pythonpdf.com/blog/article/545/510028a8c49c9f2f4b98/
来源:编程知识网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!