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

推荐订阅源

Google DeepMind News
Google DeepMind News
V
Visual Studio Blog
博客园 - Franky
N
Netflix TechBlog - Medium
WordPress大学
WordPress大学
小众软件
小众软件
Jina AI
Jina AI
L
Lohrmann on Cybersecurity
罗磊的独立博客
I
Intezer
W
WeLiveSecurity
T
Tenable Blog
Cyberwarzone
Cyberwarzone
P
Privacy & Cybersecurity Law Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Securelist
Recent Announcements
Recent Announcements
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Engineering at Meta
Engineering at Meta
Hacker News: Ask HN
Hacker News: Ask HN
F
Full Disclosure
S
SegmentFault 最新的问题
S
Security Affairs
L
LINUX DO - 热门话题
C
CERT Recently Published Vulnerability Notes
博客园 - 叶小钗
Stack Overflow Blog
Stack Overflow Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Secure Thoughts
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Register - Security
The Register - Security
月光博客
月光博客
Microsoft Azure Blog
Microsoft Azure Blog
Last Week in AI
Last Week in AI
PCI Perspectives
PCI Perspectives
N
News | PayPal Newsroom
Schneier on Security
Schneier on Security
T
Threat Research - Cisco Blogs
B
Blog RSS Feed
L
LINUX DO - 最新话题
F
Fortinet All Blogs
雷峰网
雷峰网
Security Latest
Security Latest
大猫的无限游戏
大猫的无限游戏
P
Palo Alto Networks Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
V
V2EX
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 【当耐特】

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 以Python为例 - HaoKunT的博客 Seafile - HaoKunT的博客 Golang的小技巧 - HaoKunT的博客 归档 - HaoKunT的博客 搜索 - HaoKunT的博客
SWIG编译海康威视SDK 使用golang - HaoKunT的博客
HaoKunT · 2019-07-25 · via HaoKunT的博客

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

吐槽的话

先允许我吐槽一下海康威视的SDK有多难用SWIG编译

编译过程

准备工作

先声明我编译的是linux版本的,环境是ubuntu 18.04,还没有开始做开发,但是编译的过程没有报错

Tips:

windows的也尝试了(win10),没有问题

首先你需要去海康威视的官网下载SDK,然后安装好Go和SWIG,设定好GOPATH,然后将SDK里面的HCNetSDK.h文件放至$GOPATH/src/hkvision

不知道GOPATH是什么的童鞋请自行百度

编写interface文件

interface文件是SWIG的接口文件,用来定义C语言环境中的变量,函数等在目标语言环境中的表达,具体可参考我另一篇文章。这里我们简单粗暴的直接包含头文件好了

改写头文件

海康威视提供的头文件是不能被SWIG所识别的,这是由于SWIG对于一些C的语法不支持,导致其会疯狂的报语法错误,再加上语法错误的原因语焉不详,SWIG能支持啥不能支持啥完全懵逼,只能靠猜,目前已知的一些不支持的语法

  • 注释里面套注释,例如这样的//这里是注释1 /*这里是注释2*/
  • #define xxx时,若后面函数被xxx修饰,当xxx无对应的值而仅仅是被定义的时候,SWIG认为需要在xxx后面加分号
  • 联合嵌套在C++中是不支持的

因此我们需要先对头文件进行改写,另外请注意SWIG之后需要用cgo来进行编译,而cgo是不支持C++的,所以我们需要将C++的语法去掉,尤其是extern "C",用宏定义即可(C++自带__cplusplus宏)

使用正则表达式去掉所有注释

  • //.*$
  • /\*[\w\s\d\[\];\.\\]*\*/ (这里中括号中间要加一个代表中文的东西)

使用正则表达式去掉函数前面的NET_DVR_API__std

这里的正则想不起来了反正到时候自己看这写就好了

去掉CALLBACK

这里正则也想不起来了

这里是因为CALLBACK在SWIG的时候过不了

使用正则为无tag的结构体加上tag

这里正则也想不起来了

多说一句,这里是因为后来gcc报了一个warning,没有这个tag的结构提貌似在外部就不可见了,不知道什么情况,反正我给这玩意加上了,要是有大神知道什么情况的话可以选择性忽略

删除无实现的函数

有一些函数在so里面并没有实现,我在官方的文档上也没看到这个函数,但是头文件里面已经有相关的函数定义,而没有实现的话在链接的时候gcc会因为没有找到函数实现报错,因此这一点比较坑,你需要先编译一遍,然后对着报错手动把这些函数删掉,通常包括旧有方法的新版本,例如xxxx_V50等等,和具体的SDK版本有关

这里有已经修改好的一份修改好的头文件可以用,版本具体记不清了,是19年3月的版本,64位

开始编译

生成xxx_wrap.c文件和xxx.go文件

首先生成wrap文件和go文件,执行的指令是swig -go -cgo -intgosize 64 hkvision.i,这一步大概需要半小时,因具体的机器而异,我用的是E5 2690 v3

编译

编译之前,先打开go文件,在cgo的前面的注释上加上#cgo LDFLAGS: -L./ -lxxxx,就是给gcc参数,gcc链接的时候去找动态库

然后开始编译,go install -x -v,这一步需要的时间很长,我机器上大概4个半小时,你可以晚上挂着跑第二天起来看结果,或者nohup挂在后台,你去做其他的事情。

一切顺利的话在$GOPATH/pkg/linux_amd64/下面你会看到hikvision.a文件(超大,有200M)

报错了怎么办

沉着冷静别惊慌,先去看输出,输出里面有很多有用信息,这就是为什么编译的时候带上-x参数,你可以看到详细的编译过程,报错通常有两种

  • 语法错误,配置错误等,这种错误一般马上就会报错,然后程序退出,这都是低级错误,你很快就能改好
  • 编译错误,这种错误就很麻烦了,一般都是你等了几个小时,结果给你报错,不过别慌,无非就是你头文件没改好,或者你库的位置不对,链接不到动态库

其他语言

其他语言应该都差不多,具体的差别就是看你使用的编译器了,msvc mingw 原生gcc

PS:msvcgcc差别蛮大的,另外cgo没有使用g++的原因是会报一个错,在pthread这个库里面,这个库是cgo原生需要引入的一个库,而这个库貌似不支持g++