惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
V
V2EX
GbyAI
GbyAI
Recent Announcements
Recent Announcements
Microsoft Security Blog
Microsoft Security Blog
阮一峰的网络日志
阮一峰的网络日志
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
Y
Y Combinator Blog
C
Check Point Blog
爱范儿
爱范儿
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
美团技术团队
雷峰网
雷峰网
IT之家
IT之家
WordPress大学
WordPress大学
V
Visual Studio Blog
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog
N
News and Events Feed by Topic
罗磊的独立博客
S
SegmentFault 最新的问题
S
Security Affairs
aimingoo的专栏
aimingoo的专栏
F
Fortinet All Blogs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
H
Hacker News: Front Page
Google DeepMind News
Google DeepMind News
B
Blog
O
OpenAI News
C
Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
The Last Watchdog
The Last Watchdog
Hacker News: Ask HN
Hacker News: Ask HN
博客园_首页
人人都是产品经理
人人都是产品经理
C
Cybersecurity and Infrastructure Security Agency CISA
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Help Net Security
Help Net Security
月光博客
月光博客
J
Java Code Geeks
L
LangChain Blog
博客园 - 司徒正美
Stack Overflow Blog
Stack Overflow Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Apple Machine Learning Research
Apple Machine Learning Research
T
The Exploit Database - CXSecurity.com
N
News and Events Feed by Topic
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

HaoKunT的博客

如何用 ollama 快速下载 deepseek 模型 - HaoKunT的博客 python使用gdal - HaoKunT的博客 Word中写LaTeX公式 - HaoKunT的博客 g++中的rpath和runpath - HaoKunT的博客 Ext4文件系统 - HaoKunT的博客 文件系统介绍 - HaoKunT的博客 理解shell - HaoKunT的博客 Hyper V安装ENVI - HaoKunT的博客 华为软件实习生笔试 - HaoKunT的博客 用C++实现一个命令行进度条 - HaoKunT的博客 PCA与GWPCA - HaoKunT的博客 字节后台实习生笔试题目 - HaoKunT的博客 Web终端仿真器 - HaoKunT的博客 阿里云API网关与函数计算的基础理解 - HaoKunT的博客 函数计算搭建DNS服务器 - HaoKunT的博客 DNS解析过程 - HaoKunT的博客 Github图片加载不出来 - HaoKunT的博客 将Elementary OS装在U盘中 - HaoKunT的博客 MacOS+Windows 双系统的安装 - HaoKunT的博客 IPXE+netboot+ISCSI 网络启动 - HaoKunT的博客 Esxi+NAS+Openwrt - HaoKunT的博客 Esxi的安装和使用 - HaoKunT的博客 利用acme自动更新证书 - HaoKunT的博客 Golang使用海康威视SDK - HaoKunT的博客 Filetools工具 - HaoKunT的博客 学习正则表达式 - HaoKunT的博客 Vugu View - HaoKunT的博客 Django Restframework 嵌套序列化 - HaoKunT的博客 看不了netlify的部署日志 - HaoKunT的博客 Go Modules的使用 - HaoKunT的博客 使用hugo+netlify部署个人主页 - HaoKunT的博客 关于我 - HaoKunT的博客 在线工具大全 - HaoKunT的博客 SWIG编译海康威视SDK 使用golang - HaoKunT的博客 Seafile - HaoKunT的博客 Golang的小技巧 - HaoKunT的博客 归档 - HaoKunT的博客 搜索 - HaoKunT的博客
SWIG 以Python为例 - HaoKunT的博客
HaoKunT · 2019-07-25 · via HaoKunT的博客

本文为原创文章,转载注明出处,欢迎关注网站https://hkvision.cn

SWIG用途

SWIG是用于开发C/C++与Java,Python,Perl,C#等高级语言之间接口的框架,利用这个框架,我们可以很方便的将C/C++程序应用在Python等高级语言中。

SWIG的步骤

以Python为例

  • 安装SWIG(官网下载),选择对应的环境下载即可,安装完成后将swig命令所在目录添加至环境
  • 准备好源文件和头文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// example.h

#include <iostream>

using namespace std;

class example {
    private:
        int num;
    public:
        void say_hello(void);
        void change(int din);
        int get_num();
};

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 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;
}

另外,需要编写对应源文件和头文件的i文件,i文件的具体语法请参考官方文档

// example.i
%module Example_swig // 模块名

%{
#include "example.h" // 这里是用于编译时需要的环境
%}

// 这里是用于生成中间代码时需要的Interface,若想将整个头文件中的声明全导出,则选择使用%include "example"方式
// 若想导出部分,则将想导出的声明放在这里
%include "example.h" 
  • swig生成中间代码 swig -python -c++ example.i

  • 下面是以VS2017为编译环境,具体编译环境请以Python的底层编译环境为准,若不知道底层编译环境是什么,命令行python,出来的头部信息中带有相关的信息,例如Python3.6是MSVC140,即VS2015的编译器编译的。

    1. 首先建立空工程,选择输出dll
    2. 然后将源文件和头文件添加至项目中(可能还需要添加i文件),将生成中间代码步骤中生成的cxx文件添加至项目(这个文件才是生成最后动态链接库的主力文件)
    3. 然后将Python的include文件夹与libs文件夹分别添加至包含目录与附加库目录中,具体做法请参考
    4. 若有其他需要添加的环境等请一并配置好
    5. 最后生成,然后将生成的dll文件改名为_模块名.pyd,将生成中间代码步骤中生成的py文件和pyd文件放在一起,就大功告成了。

SWIG需要注意的地方

  1. 整个过程分为两部分,第一部分是生成中间代码,第二部分是编译,生成中间代码会执行不含%{….%}的部分,也就是说如果生成中间代码出了错,请不要在这部分找问题 第二部分是编译,生成中间代码的步骤中包含%{….%}的地方将会被放在cxx文件中,也就是说这部分是在编译时起作用的。
  2. 生成中间代码仅仅是生成待编译的cxx文件,swig只需要找到接口的声明就好,不关心其实现。
  3. SWIG支持的语法不多,若生成中间代码步骤中报错,可以考虑是SWIG的问题,尽量采用ANSI C的语法。

编译整个海康威视SDK

如果你想编译整个SDK的话请参考我另外一篇文章