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