win平台c语言引入开源库的问题与解决,以引入cJSON库为例

目录

遇到的问题

开源依赖库引入的问题

问题的解决

生成dll文件

方式一

方式二

在VsCode中如何使用开源库

文件放置位置

配置文件进行配置

引入头文件

结束


许久不写博客,五一还在加班,就浅浅写一篇吧。

最近除了做物联网平台,还对网关二次开发程序做了修改,网关的二次开发去年年底的时候做过,但是当时的逻辑不是十分完善,差不多已经过了半年了,很多细节已经忘记了。

虽然代码也就一百来行,但是因为涉及到引入开源库的问题,以前从来没有尝试过这个,不知道怎么在本地调试,让我十分头疼。

这篇博客还作作为记录问题的博客,着急的朋友可以直接看问题的解决

遇到的问题

最开始我的开发流程如下

  1. 编写网关二次开发代码
  2. 使用网关厂家提供的云编译器,将程序编译成bin文件
  3. 使用网关配置软件将bin文件下载到网关上
  4. 使用配置软件查看代码打印的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++的开发,要去完成网关的二次开发,终于完成了,一路走来搜了多少博客,问了多少问题,属实不容易。

所以我也深知大家的不易,因此写下了这篇博客,希望能够帮助大家。

最后,如果帮到你了,希望你可以点个赞,关注一下我,这篇博客可能还有很多地方不完善,欢迎大家提出意见,后续继续进行完善,谢谢大家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/8188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot过滤器简单构建详细教程以及与拦截器区别解释

作用范围:过滤器基于Servlet规范,作用于更广泛的层面,不仅限于Spring MVC,它可以拦截进入Web应用的所有请求,包括静态资源请求。过滤器可以对请求和响应的内容进行预处理和后处理。实现方式:过滤器需要实现…

微机控制电子式万能试验机WDW-5B

一.项目简介: 国内微机控制电子式万能试验机起步于90年代初,为提高企业产品的技术水平,公司先后引进国外先进技术,使公司的产品技术水平跃上了一个新的台阶。 二.使用领域: 该产品广泛用于金属、非金属材料的拉、压…

Progesterone(孕酮/黄体酮) ELISA检测试剂盒--3小时内可得到检测结果

孕酮(Progesterone)又称为黄体酮,是卵巢分泌的具有生物活性的主要孕激素,负责与生殖有关的活动,如乳房腺体发育、参与月经周期以及妊娠的建立和维持。此外,孕酮还参与支持妊娠期间的生理过程,包…

数据库数据恢复—Sql Server数据库文件丢失丢失怎么恢复数据?

数据库数据恢复环境: 5块硬盘组建一组RAID5阵列,划分LUN供windows系统服务器使用。windows系统服务器内运行了Sql Server数据库,存储空间在操作系统层面划分了三个逻辑分区。 数据库故障: 数据库文件丢失,主要涉及3个…

【Kali Linux工具篇】使用Aircrack-ng破解wifi密码

前期准备 1、一个无线网卡 2、密钥爆破字典 实站过程 1、设置wlan为监听模式 airmon-ng start wlan0 #开启网卡wlan0监听模式 iwconfig #查看网卡状态,发现wlan0mon,表示已开启成功2、探测附近WiFi airdump-ng wlan0monBSSID 代表…

asp.net不用验证码包,如何实现手写验证码

引文:众所周知,一般我们日常碰到的验证码是一个图形样式的,列入这个样子的,那么在这个图片里面我们想实现我们自己界面上有这样的一个验证码就需要做两个操作,一个是在我们自己界面上生成如图所示的一个验证码图片&…

任务管理系统是什么?功能、特点、价值分析

任务管理系统是一种高效的项目管理工具,旨在帮助团队或个人有效组织、分配和追踪任务进度。它具有任务规划和分配、进度追踪、以及团队协作等功能。不仅确保每个成员都能明确自己的任务职责,管理者也能实时掌握项目整体进度。通过任务管理系统&#xff0…

案例导入说明.md

案例导入说明 为了演示多级缓存,我们先导入一个商品管理的案例,其中包含商品的CRUD功能。我们将来会给查询商品添加多级缓存。 1.安装MySQL 后期做数据同步需要用到 MySQL 的主从功能,所以需要大家在虚拟机中,利用 Docker 来运行一…

Golang | Leetcode Golang题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; func searchMatrix(matrix [][]int, target int) bool {m, n : len(matrix), len(matrix[0])i : sort.Search(m*n, func(i int) bool { return matrix[i/n][i%n] > target })return i < m*n && matrix[i/n][i%n] target }

数据处理学习笔记9

一些其他的函数 “Resize”和“Reshape”的区别主要在于它们对数组元素数量和形状的处理方式不同&#xff0c;以下是详细介绍&#xff1a; “Resize”通常会改变数组的元素数量&#xff0c;在放大数组形状时会用0补全新增的元素&#xff0c;而在缩小数组形状时会丢弃多余的元素…

Redis 实战之事务的实现

事务的实现 事务开始命令入队事务队列执行事务总结 一个事务从开始到结束通常会经历以下三个阶段&#xff1a; 1、 事务开始&#xff1b; 2、 命令入队&#xff1b; 3、事务执行。 本节接下来的内容将对这三个阶段进行介绍&#xff0c; 说明一个事务从开始到结束的整个过程。 …

ICLR 2024 杰出论文出炉:“大模型”成最大赢家

昨天&#xff0c;国际表征学习大会&#xff08;International Conference on Learning Representations&#xff0c;ICLR&#xff09;公布了 ICLR 2024 杰出论文。 其中&#xff0c;在 5 篇杰出论文中&#xff0c;有 4 篇论文涉及大模型。另外&#xff0c;也有 11 篇论文获得荣…

Linux学习之高级IO

之前的内容我们基本掌握了基础IO&#xff0c;如套接字&#xff0c;文件描述符&#xff0c;重定向&#xff0c;缓冲区等知识都是文的基本认识&#xff0c;而高级IO则是指更加高效的IO。 对于应用层&#xff0c;在读写的时候&#xff0c;本质就是把数据写给OS&#xff0c;若一方…

从互联网医院源码到搭建:开发视频问诊小程序的技术解析

如今&#xff0c;视频问诊小程序作为医疗服务的一种新形式&#xff0c;正逐渐受到人们的关注和青睐。今天&#xff0c;小编将为您详解视频问诊小程序的开发流程。 一、背景介绍 互联网医院源码是视频问诊小程序开发的基础&#xff0c;它提供了一套完整的医疗服务系统框架&…

zlib编译后静态库调用时遇到的无法解析的外部符号问题

编译zlib的静态库后引用到项目中使用&#xff0c;发现报下面的链接错误&#xff1a; error LNK2019: 无法解析的外部符号 _zlibVersion error LNK2019: 无法解析的外部符号 _deflateEnd error LNK2019: 无法解析的外部符号 _deflate error LNK2019: 无法解析的外部符号 _deflat…

【Linux 性能详解】CPU性能篇

目录 平均负载&#xff08;Load Average&#xff09; CPU上下文切换 进程上下文切换 线程上下文切换 中断上下文切换 中断 硬中断 软中断 CPU使用率 性能分析工具 平均负载&#xff08;Load Average&#xff09; 平均负载&#xff1f;这个词对很多人来说&#xff0c…

构建第一个ArkTS应用之@AppStorage:应用全局的UI状态存储

AppStorage是应用全局的UI状态存储&#xff0c;是和应用的进程绑定的&#xff0c;由UI框架在应用程序启动时创建&#xff0c;为应用程序UI状态属性提供中央存储。 和AppStorage不同的是&#xff0c;LocalStorage是页面级的&#xff0c;通常应用于页面内的数据共享。而AppStora…

中国护照照片尺寸分辨率要求及居家自拍制作教程

经常出国的小伙伴都知道&#xff0c;护照照片作为出国旅行的重要身份证明文件&#xff0c;其规格和质量要求非常严格。本文将详细介绍中国护照照片的具体要求&#xff0c;并提供一些实用的居家自拍技巧&#xff0c;帮助您轻松拍出符合规定的护照照片&#xff08;手机和相机居家…

革新品质检测,质构科技重塑肉类行业新篇章

革新品质检测&#xff0c;质构科技重塑肉类行业新篇章 在现代社会&#xff0c;消费者对食品安全和品质的要求日益提升&#xff0c;特别是在肉类行业。为了满足这一市场需求&#xff0c;质构科技凭借其精准、高效的优势&#xff0c;正逐渐成为肉类品质检测的新星。今天&#xf…

QT-TCP通信

网上的资料太过于书面化&#xff0c;所以看起来有的让人云里雾里&#xff0c;看不懂C-tcpsockt和S-tcpsocket的关系 所以我稍微画了一下草图帮助大家理解两个套接字之间的关系。字迹有的飘逸勉强看看 下面是代码 服务端&#xff1a; MainWindow::MainWindow(QWidget *parent) …