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

news2024/11/17 12:35:27

目录

遇到的问题

开源依赖库引入的问题

问题的解决

生成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.coloradmin.cn/o/1664590.html

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

相关文章

HCIP-Datacom-ARST必选题库_OSPF【道题】

某工程师利用2台路由器进行IPv6测试,他想要通过运行OSPFv3实现IPv6网络的互联互通。关于R1需要进行的OSPPv3相关配置,正确的有? [R1] router id 10.1.1.1A [R1-Giqabi tEthernet0/0/1] ospfv3 1 area 0 [R1-ospfv3-11 router-id 10.1.1.1 [R1-ospfv3…

Linux-线程概念

1. 线程概念 线程:轻量级进程,在进程内部执行,是OS调度的基本单位;进程内部线程共用同一个地址空间,同一个页表,以及内存中的代码和数据,这些资源对于线程来说都是共享的资源 进程:…

五一 大项目--docker-compose编排lnmp完成wordpress

Docker 中的 Nginx 服务为什么要启用 HTTPS 一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos…

如何将手写数学公式识别?识别工具在这里

如何将手写数学公式识别?在日常学习中,将手写数学公式识别出来可以极大地提高我们的学习效率。通过这一技术,我们能够快速、准确地将手写公式转化为可编辑的文本,省去了繁琐的输入过程。这不仅节约了时间,还减少了因输…

【论文阅读笔记】jTrans(ISSTA 22)

个人博客地址 [ISSTA 22] jTrans(个人阅读笔记) 论文:《jTrans: Jump-Aware Transformer for Binary Code Similarity》 仓库:https://github.com/vul337/jTrans 提出的问题 二进制代码相似性检测(BCSD&#xff0…

OpenCV 入门(六) —— Android 下的人脸识别

OpenCV 入门系列: OpenCV 入门(一)—— OpenCV 基础 OpenCV 入门(二)—— 车牌定位 OpenCV 入门(三)—— 车牌筛选 OpenCV 入门(四)—— 车牌号识别 OpenCV 入门&#xf…

【数据分析】 JupyterNotebook安装及使用简介

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 在数据分析中,一般用Pycharm编辑代…

【软考】模拟考卷错题本2024-05-11

1 设计模式- 适配器模式 基本上上述的图解已经涵盖了绝大多数主流的设计模式和其特点。理解记忆下即可,这里对下午的考题也有帮助的。 2 计算机组成原理 cpu 访问速度 这个真的是憨憨咯~看到内存就选内存,题目都没审好。这里的速度比cpu内部的要比外部的…

C++入门系列-析构函数

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 析构函数 概念 析构函数,与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的,而对象在销…

【Linux】-网络请求和下载、端口[6]

目录 一、网络请求和下载 1、ping命令 2、wget命令 3、curl命令 二、端口 1、虚拟端口 2、查看端口占用 一、网络请求和下载 1、ping命令 可以通过ping命令,检查指定的网络服务器是否可联通状态 语法:ping [ -c num ] ip或主机名 选项&…

怎么做自己的网站

现如今,拥有自己的网站已经成为现代生活中的一种标志。无论是个人博客、在线商店还是企业官网,都可以通过拥有一个网站来展示自己的个性、产品或服务。在这篇文章中,我将分享如何创建和管理自己的网站。 首先,你需要选择一个合适的…

OGG几何内核开发-BRepAlgoAPI_Fuse与BRep_Builder.MakeCompound比较

最近在与同事讨论BRepAlgoAPI_Fuse与BRep_Builder.MakeCompound有什么区别。 一、从直觉上来说,BRepAlgoAPI_Fuse会对两个实体相交处理,相交的部分会重新的生成相关的曲面。而BRep_Builder.MakeCompound仅仅是把两个实体组合成一个新的实体,…

30%参数达到92%的表现,大模型稀疏化方法显神通

当我还是一位懵懂少年的时候,总认为“任务难度”,“参数规模”和“准确率”是一个不可兼顾的三角,比如当我想要挑战更难的任务,追求获得更高的准确率,那必然就要在更大的模型参数量上进行妥协。然而,真的是…

使用 Docker 部署 VS Code in The Browser

1)介绍 GitHub:https://github.com/coder/code-server 在日常学习工作中,Vscode 已成为我们首选的代码编辑器。然而,其局限性在于当我们从家到公司移动时,难以保持连续的编码体验。针对这一痛点,虽然市面上…

OpenCV的视频 I/O 的标志(77)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 下一篇 :OpenCV系列文章目录(持续更新中......) ​ 枚举 枚举 cv::VideoCaptureAPIs { cv::CAP_ANY 0, cv::CAP_VFW 200, cv::CAP_V4L 200, cv::CAP_V4L2 …

基于51单片机的二氧化碳检测及调节系统仿真

基于51单片机的二氧化碳检测及调节系统 (仿真+程序) 功能介绍 具体功能: 1.二氧化碳传感器测得二氧化碳数据后经过单片机处理。 2.LCD1602实时显示,第一行显示测得的浓度值,第二行显示报警阈值。 3.测…

【gpedit.msc】组策略编辑器的安装,针对windows家庭版,没有此功能

创建一个记事本文件然后放入以下内容 echo offpushd "%~dp0"dir /b %systemroot%\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >gp.txtdir /b %systemroot%\servicing\Packages\Microsoft-Windows-GroupPolicy-…

安装Centos7提示dracut:/# 及磁盘空闲不足的坑

前言 这个问题是因为安装程序没有找到安装文件的位置,一般仅出现在安装过Windows系统的电脑上。 如果出现该错误,两种解决办法。 解决 方法一: 开机时,进入启动选项,选择不带UEFI的U盘进行启动可以直接避免这个坑。 …

IIS配置SSL,根据pem和key生成pfx,openssl的版本不能太高

1、生成pfx文件 供应商给的文件是pef和key后缀的两个文件,在IIS里不好导入(如果有知道好导入的可以给我留言,谢谢。)。 1.1 下载OpenSSL工具,并安装。 主要用于将.pem文件转成.pfx文件。 下载OpenSSL的链接:http://slproweb.com/…

地下工程中测斜仪的关键应用

地下工程,如隧道、地铁和基坑等项目的建设,对于现代城市的发展至关重要。然而,这些工程的实施往往伴随着诸多风险,特别是与周围土体的稳定性有关的风险。为了确保工程的安全进行,实时监测技术变得尤为关键。其中&#…