许久不写博客,五一还在加班,就浅浅写一篇吧
最近除了做物联网平台
还对网关二次开发程序做了修改,网关的二次开发去年年底的时候做过,但是当时的逻辑不是十分完善,差不多已经过了半年了,很多细节已经忘记了。虽然代码也就一百来行,但是没办法在本地调试,让我十分头疼,因为涉及到引入开源库的问题,以前从来没有尝试过这个。
遇到的问题
最开始我的流程如下
- 编写开发代码
- 使用网关厂家提供的云编译器,将程序编译成bin文件
- 使用网关配置软件将bin文件下载到网关上
- 使用配置软件查看代码打印的debug信息,进行进一步的调整
这个过程看起来还好,但是实际上问题很多
首先因为没有在c平台上使用过开源库,不知道怎么引入依赖文件,无法运行程序,代码写完之后只能肉眼观察有没有错误,编译阶段也只能检查出语法错误。有的时候bug严重的话,程序一下载到网关上网关瞬间就挂了,都没有打印debug日志的机会,只能恢复出厂设置。
其次,在我找网关技术客服之前,向网关上下载程序是一件很麻烦的事情,因为我的电脑跟网关设备隔得有点远,只能通过路由器的局域网进行无线连接,向网关上下载程序经常下到一半就异常终止了,频率高到什么程度呢,平均一次完整的下载要一分钟多点,周末下午我坐在实验室试了一下午都没成功过一次,让人心力憔悴。
这就导致什么情况呢,代码每改动一次,想要下载到网关上看debug信息都很困难。
后来咨询了技术支持客服,才知道可以进行设备直连,一次成功,几乎没有下载失败过,自此,我对有线连接的稳定性有了新的认识。
但是即使下载方便之后,因为代码bug太严重,一下载到网关上网关就挂了,想得到调试信息基本不可能,只能想办法在本地进行逐行调试了,以下就开始介绍是怎么引入开源依赖库并且让程序跑起来的
开源依赖库的引入
我的环境是Windows平台+Vscode+Mingw64
这是我找到的对我有帮助的博客,不知道为什么最开始没有找到
C语言怎么调用开源库
Windows编译cjson
最开始我找到的教程都是下边这样
大家似乎默认我知道后边该怎么做了,然后我真的只是放到项目里,引入了头文件,就会出现下边的输出
就很懵逼,还有博客让用cmake进行构建,对于只在大一跟着学校课程学过一点c的我来说一脸懵逼,但是在我的刻苦钻研下,用cmake和gcc还真让我编译出来dll动态链接文件了,虽然不知道什么原理。
但是这个dll引入到项目就会在一个函数内部报错,就是cJSON_Print()函数内部出现了一个段错误
具体bug我也复现不出来了,但是给我搞得又很懵逼,我还以为是我的用法错了,去搜各种使用教程,去看了cJSON的github使用文档,并没有发现什么错误,但是程序运行到这里就是会报错然后终止。
我就试着运行cJSON的test文件,我想着官方的测试文件总不能用法不对吧,结果test也跑不通。这么出名的开源库,怎么会在这么基础的函数上出错,各种搜报错信息也搜不到
再后来甚至还在博客园上找到了另一个版本的cJSON,因为点进去发现cJSON_Print函数的实现不一样,现在看可能是cJSON的早期版本吧,我还用那个版本试了,结果当然也是不行的,因为打开方式完全不对啊
因为我们实验室主要都是搞前后端开发的,而我们物联网作为后端的一个分支,在c语言和硬件相关方面是没有人能请教的,就在我即将放弃的时候,发现了这个博客
Windows编译cjson
看到方法不太一样,我就抱着试一试的心态,结果真的运行成功了,然后就顺利的找出了程序里的bug
问题的解决
事实上我们可以选择动态链接和静态链接,还可以选择不同的编译方式
这里我选择动态链接,生成的是dll文件
gcc -fpic -shared cJSON.c -o libcjson.dll
1. gcc -o test test.c -L. -lcjson
在这条命令中,-L参数是指定库所在文件夹的,-l是指定库名的
不知道为什么,-L只能指定当前文件夹,如果我把dll文件放到./lib下,再在-L中指定,编译出来的exe文件就无法运行,说找不到dll文件,原因还是没找到,先放一放吧
2. gcc test.c libcjson.dll -o test
这种方式也需要dll文件和c文件在同一个目录下
不知道为什么,好像很多c/c++工作者都是用的linux平台,他们指定库文件所在目录都能成功
这些问题先放一放吧,这篇文章就先写这么多,后续还会做进一步的修改和整理