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++的开发,要去完成网关的二次开发,终于完成了,一路走来搜了多少博客,问了多少问题,属实不容易。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何恢复手机视频?手机视频恢复软件有哪些?

随着手机使用的普及,我们的日常生活、工作甚至娱乐都与它息息相关。而在其中,我们宝贵的视频文件则是记录下我们生活、工作和重要时刻的重要载体。然而,当这些视频文件不幸丢失或被误删,我们的内心往往会感到一阵恐慌。这时候&…

团队执行力差,多半都是管理的问题

在日常管理中,我们习惯用“执行力好不好”来评价一个团队的表现,但实际上,执行力更应该是一个管理者需要思考和解决的问题,而非单纯归咎于团队。 我们需要明确一点:执行力不是团队的问题,而是管理者的问题…

nestjs版若依全栈管理后台完全开源!

hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续和大家分享一下我们小伙伴开源的基于 nestjs 的若依全栈管理系统。 相信前端小伙伴对若依管理系统并不陌生,它的后端采用…

浙大最新开源:MGMap-掩码引导学习的在线矢量化高精地图构建方法

论文标题: MGMap: Mask-Guided Learning for Online Vectorized HD Map Construction 论文作者: Xiaolu Liu, Song Wang, Wentong Li, Ruizi Yang, Junbo Chen, Jianke Zhu 作者单位:浙江大学,有鹿科技 开源地址:…

Android 网络请求 实现

Android 网络请求 实现 一、背景 在Android开发中,网络请求是一个非常常见的需求。应用程序可能需要与远程服务器通信来获取数据、上传文件、验证用户身份等等。背景下,Android应用通常会面临以下几个主要情况和挑战: ①数据交互: 许多应用程序需要从服务器获取数据,例…

taos数据库服务器安装

涛思数据库服务器安装分为两种情况 一。新服务器直接安装(非常好) 二。旧服务器删除后删除干净再安装(麻烦得很) 先来讲解一下情况一: 找需要的taos安装版本链接:https://docs.taosdata.com/releases/tde…

基于springboot实现体育馆管理系统项目【项目源码+论文说明】

基于springboot实现体育馆管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理…

如何阅读:一个已被证实的低投入高回报的学习方法的笔记

系列文章目录 如何有效阅读一本书笔记 如何阅读:一个已被证实的低投入高回报的学习方法 麦肯锡精英高效阅读法笔记 读懂一本书笔记 文章目录 系列文章目录第一章 扫清阅读障碍破解读不快、读不进去的谜题一切为了阅读小学教师让你做,但中学老师阻止你做的…

Python - Excel拆分详解(按工作表、行、列、内容拆分)

目录 引言 安装Python Excel库 Python按工作表拆分Excel Python按行拆分Excel Python按列拆分Excel Python按内容拆分Excel 引言 拆分Excel文件是一种将大型工作簿分割为更小、更易管理的部分的有效方法。当面对包含大量数据或复杂信息的工作簿时,拆分文件可…

【Linux】25. 网络基础(一)

网络基础(一) 计算机网络背景 网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 其实本质上一台计算机内部也是一个小型网络结构(如果我们将计算机内部某个硬件不存放在电脑中,而是拉根长长的线进行连接。这其实也就是网…

存储大作战:探索Local Storage与Session Storage的奥秘

欢迎来到我的博客,代码的世界里,每一行都是一个故事 存储大作战:探索Local Storage与Session Storage的奥秘 前言Local Storage与Session Storage简介数据存储生命周期容量限制安全性 前言 在Web的世界里,数据就像是一群流浪者&a…

C++ 递归函数

一 递归函数 递归函数(Recursive Function)即自调用函数,即在函数体内有直接或间接地自己调用自己的语句。 大多数递归函数都能够用非递归函数代替。 例如:求两个整数a,b的最大公约数。 算法描述: 大多数递归函数都能用非递归…

武汉星起航:亚马逊年终促销新策略——强化营销,优化体验赢未来

年终节日是电商平台的黄金销售期,也是各大电商平台竞相展示自身实力与智慧的重要舞台。作为全球电商巨头的亚马逊,自然也不例外。每年的年终节日,亚马逊都会推出一系列精彩纷呈的促销活动,吸引全球消费者的目光,实现销…

Vue 中 $nextTick 的作用是什么?

目录 一、NextTick是什么 为什么要有nexttick 二、使用场景 三、实现原理 一、NextTick是什么 官方对其的定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM 什么意思呢? 我们可以理解成&#xff0c…

web安全day03

MYSQL注入: SQL 注入的原理、危害及防御措施 SQL 注入的原理:原本的 SQL 语句在与用户可控的参数经过了如拼接、替换等字符串操作后,得到一个新的 SQL 语句并被数据库解析执行,从而达到非预期的效果。 SQL 注入的危害&#xff…

OpenAI泄密者加入马斯克xAI,技术版图扩张;OpenAI推出可识别DALL·E 3图像的AI检测工具

🦉 AI新闻 🚀 OpenAI泄密者加入马斯克xAI,技术版图扩张 摘要:最近,曾在OpenAI任职并被指控泄露机密的Pavel Izmailov迅速加入了马斯克旗下的xAI团队,成为研究员。在加入之前,Izmailov因涉嫌泄…

crossover不能生成容器 无法创建容器怎么办

CrossOver不能生成容器,我们应该先了解什么是容器,容器是盛放类虚拟机——CrossOver在macOS系统和Linux系统下载的win版软件的器皿。无法创建容器怎么办?无法创建多数情况是macOS系统与CrossOver不兼容所造成的。 首先,我们将介绍…

修图新风尚:AI技术赋能,Remini引领修图新纪元,从Remini到未来,AI修图如何改变我们的视觉世界?

最近一款名为Remini的AI修图软件凭借其独特的“丑萌”的黏土风格,迅速在海内外市场走红。 用户只需要上传一张照片,就可以利用AI技术生成对应的黏土滤镜风格的图像。 “黏土AI”风格的图像刷爆了今年的五一假期旅游照片“大赛”,在小红书、…

AI无人自动实景直播系统,挑战高效 实时 智能 全新的直播方式

随着科技的不断发展,人工智能(AI)已经涉足并改变了各个行业,直播领域也不例外。传统的直播方式依赖于真人主持和人工操作,而现在,AI无人自动实景直播系统的出现,正在挑战着传统直播的方式&#…

苹果iPad M4:Console级别图形和AI强大功能

苹果iPad M4:Console级别图形和AI强大功能 Apple近日发布了最新的M4芯片,旨在为iPad Pro系列带来明显的性能提升和电池续航时间延长。在本篇报道中,我们将详细介绍M4芯片的特点、性能改进和为创意专业人士带来的影响。 M4芯片的强大功能 …