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

embedded/2024/9/24 21:17:51/

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


遇到的问题


最开始我的流程如下

  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.ppmy.cn/embedded/31758.html

相关文章

数仓技术选型

数仓技术选型 考虑因素 考虑因素 数据量大小,业务需求,行业内经验,技术成熟度,开发维护成本,学习成本,总成本预算。 数据存储:MySQl,HDFS,HBase,Redis&#…

Golang | Leetcode Golang题解之第56题合并区间

题目&#xff1a; 题解&#xff1a; func merge(intervals [][]int) (ans [][]int) {sort.Slice(intervals, func(i, j int) bool { return intervals[i][0] < intervals[j][0] })ans append(ans, intervals[0])for _, e : range intervals[1:] {if ans[len(ans)-1][1] &l…

AI代理架构的发展:从单一到多代理系统的演进及其影响分析

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

机器学习的两种典型任务

机器学习中的典型任务类型可以分为分类任务&#xff08;Classification&#xff09;和回归任务&#xff08;Regression&#xff09; 分类任务 回归任务 简单的理解&#xff0c;分类任务是对离散值进行预测&#xff0c;根据每个样本的值/特征预测该样本属于类 型A、类型B 还是类…

匠心精神与创新力量:构筑网络安全的新防线

一、匠心精神在网络安全中的重要性 匠心精神代表着对工作的专注和对质量的极致追求。在网络安全领域&#xff0c;这意味着对每一个安全漏洞的深入挖掘&#xff0c;对每一项安全技术的精心打磨。亿林网络李璐昆的提名&#xff0c;正是对其在网络安全领域匠心精神的认可。 二、…

提示词工程入门-使用文心一言4.0-通义千问-GPT4-Claude3通用提示技巧测试

提示词工程基础&#x1f680; 在了解完了大语模型的基本知识&#xff0c;例如API的使用多轮对话&#xff0c;流式输出&#xff0c;微调&#xff0c;知识向量库等知识之后&#xff0c;接下来需要进一步补足的一个大块就是提示词工程&#xff0c;学习和了解提示词工程除了基本的提…

Day27-Java基础之常用类2

第一章 Date类 1.1 Date概述 java.util.Date类 表示特定的瞬间&#xff0c;精确到毫秒。 继续查阅Date类的描述&#xff0c;发现Date拥有多个构造函数&#xff0c;只是部分已经过时&#xff0c;我们重点看以下两个构造函数 public Date()&#xff1a;从运行程序的此时此刻到…

Linux服务器常用命令总结

view查找日志关键词 注意日志级别&#xff0c;回车后等一会儿&#xff0c;因为文件可能比较大加载完需要时间 当内容显示出来后&#xff0c;使用“/关键词”搜索 回车就能搜到&#xff0c;n表示查找下一个&#xff0c;N表示查找上一个 find 查找 find Family -name book …