关于win平台c语言引入开源库的问题与解决

news2025/1/12 6:17:56

许久不写博客,五一还在加班,就浅浅写一篇吧
最近除了做物联网平台
还对网关二次开发程序做了修改,网关的二次开发去年年底的时候做过,但是当时的逻辑不是十分完善,差不多已经过了半年了,很多细节已经忘记了。虽然代码也就一百来行,但是没办法在本地调试,让我十分头疼,因为涉及到引入开源库的问题,以前从来没有尝试过这个。


遇到的问题


最开始我的流程如下

  1. 编写开发代码
  2. 使用网关厂家提供的云编译器,将程序编译成bin文件
  3. 使用网关配置软件将bin文件下载到网关上
  4. 使用配置软件查看代码打印的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平台,他们指定库文件所在目录都能成功
这些问题先放一放吧,这篇文章就先写这么多,后续还会做进一步的修改和整理

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

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

相关文章

Java--方法的使用

1.1什么是方法 方法顾名思义就是解决问题的办法,在程序员写代码的时候,会遇到很多逻辑结构一样,解决相同问题时,每次都写一样的代码,这会使代码看起来比较绒余,代码量也比较多,为了解决这个问题…

VBA 根据表格指定列拆分多sheet

一. 需求 ⏹ 根据部分列,拆分数据到多个sheet页 二. 代码 ⏹ 重点代码摘要 CreateObject("scripting.dictionary"):创建一个字典对象,相当于Java中的MapDim aRef() As String:定义一个存储字符串类型的数组ReDim aRe…

Linux学习之IP协议

前言: 在学习IP协议i前,我们其实知道网络协议栈是一层层的,上层封装好之后就传给下层,对于我们治安学习到的TCP协议,在对数据进行封装之后,并不是直接就将数据进行传输,而是交给下一层网络层进…

【讲解如何OpenCV入门】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

GDPU unity游戏开发 碰撞器与触发器

砰砰叫,谁动了她的奶酪让你的小鹿乱撞了。基于此,亦即碰撞与触发的过程。 碰撞器与触发器的区别 通俗点讲,碰撞器检测碰撞,触发器检测触发,讲了跟没讲似的。碰撞器是用来检测碰撞事件的,在unity中&#xff…

发表博客之:transformer 架构 推理时候运算流程详细讲解,小白都可以看得懂,AI推理工程师必备技能!

文章目录 [发表博客之:transformer 架构 推理时候 详细讲解,小白都可以看得懂,AI推理工程师必备技能!](https://cyj666.blog.csdn.net/article/details/138439826)总结一下 发表博客之:transformer 架构 推理时候 详细…

[每日AI·0501]GitHub 版 Devin,Transformer的强力挑战者 Mamba,Sora 制作细节与踩坑,OpenAI 记忆功能

AI 资讯 国资委:加快人工智能等新技术与制造全过程、全要素深度融合GitHub版 Devin 上线,会打字就能开发应用,微软 CEO:重新定义 IDE在12个视频理解任务中,Mamba 先打败了 TransformerSora 会颠覆电影制作吗&#xff…

Python | Leetcode Python题解之第66题加一

题目: 题解: class Solution:def plusOne(self, digits: List[int]) -> List[int]:n len(digits)for i in range(n - 1, -1, -1):if digits[i] ! 9:digits[i] 1for j in range(i 1, n):digits[j] 0return digits# digits 中所有的元素均为 9retu…

Java——认识异常

目录 一.异常的概念与体系结构 1.异常的概念 1.1算术异常 1.2数组越界异常 1.3空指针异常 2.异常的体系结构 3.异常的分类 3.1编译时异常 3.2运行时异常 二.异常的处理 1.防御式编程 1.1LBYL 1.2EAFP(核心) 2.异常的抛出 3.异常的捕获 3…

1081 检查密码(测试点2简析)

solution 潜在的非法字符里可能包含空格&#xff0c;所以不能直接用cin接收string&#xff08;测试点2&#xff09; #include<iostream> #include<string> using namespace std; int judge(string s){if(s.size() < 6) return 1;int num 0, c 0;for(int i …

C++基础——输入输出(文件)

一、标准输入输出流 C 的输入输出是程序与用户或外部设备&#xff08;如文件、网络等&#xff09;之间交换信息的过程。 C 提供了丰富的标准库来支持这种交互&#xff0c;主要通过流的概念来实现。 流&#xff1a;抽象概念&#xff0c;表示一连串的数据&#xff08;字节或字…

Python爬虫--爬取糗事百科段子

爬取糗事百科段子&#xff1a; 段子在 <div class"content"> 里面的 <span> 标签里面 不过这里有个坑&#xff0c;div 标签跟 span 标签 之间有很多空行 普通 .*? 是匹配不了的&#xff0c;需要使用模式修饰符 S S 的意思 让 .(点) 匹配&#xff0c…

政安晨:【Keras机器学习示例演绎】(三十一)—— 梯度集中,提高训练效果

目录 简介 设置 准备数据 使用数据增强 定义模型 实现梯度集中化 训练工具 不使用 GC 训练模型 使用 GC 训练模型 性能比较 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对…

基于php+mysql+html简单图书管理系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、Php、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

C#语言入门

一、基础知识 1. 程序语言是什么 用于人和计算机进行交流&#xff0c;通过程序语言让计算机能够响应我们发出的指令 2. 开发环境 IDE&#xff0c;集成开发环境。它就是一类用于程序开发的软件&#xff0c;这一类软件一般包括了代码编辑、编译器、调试器、图形用户界面等等工…

springboot 整合 knife4j-openapi3

适用于&#xff1a;项目已使用shiro安全认证框架&#xff0c;整合knife4j-openapi3 1.引入依赖 <!-- knife4j-openapi3 --> <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</artifa…

【C语言】——结构体

【C语言】——结构体 一、结构体类型的声明1.1、结构体的声明1.2、结构体变量的创建和初始化1.3、结构体的特殊声明1.4、结构体的自引用1.5、结构体的重命名 二、 结构体的内存对齐2.1、对齐规则2.2、结构体对齐实践2.3、为什么存在内存对齐2.4、修改默认对齐数 三、结构体传参…

数据库(MySQL)—— 多表查询

数据库&#xff08;MySQL&#xff09;—— 多表查询 多表关系一对多多对多一对一多表查询概述数据准备查询形式笛卡尔积 分类连接查询内连接外连接左外连接右外连接 自连接联合查询 今天我们来进入MySQL中一个非常重要的部分&#xff1a;多表查询&#xff1a; 多表关系 多表关…

【HM】DevEco Studio如何使用代码编程AI助手

大家可能都有用过或了解过github copilot插件&#xff0c;确实为我们编码智能、提升开发效率有很大的帮助。推荐两款国产的ai编程插件&#xff0c;分别是华为的CodeArts Snap和阿里的通义灵码。 DevEco 中如何安装通义灵码&#xff1f; 一、下载通义灵码离线安装包 打开官网…

数组邻接表+堆优化版dijkstra+蓝桥杯2022年第十三届决赛真题-出差

文章目录 邻接表数组实现堆优化版dijkstra蓝桥杯2022年第十三届决赛真题-出差 邻接表数组实现 idx是每条边的地址e保存终点的节点值w保存每条边的权值ne[idx]保存边表&#xff0c;idx的下一个顶点的地址h[a]保存顶点表&#xff0c;a是起点&#xff0c;h[a]是终点的地址 int e…