构建C语言开发环境

news2024/9/24 17:11:04

有些C/C++项目开发周期极长。在处理此类项目过程中,构建开发环境就像施展魔法一样:测试框架被巧妙集成在一起,CI/CD流程将开发者从繁琐重复的工作中解脱出来。

作为程序员,在开发过程中,我只有一个简单的愿望:在当前的开发环境中将C库简化为少数几个文件。

在本文中,我们将介绍如何为C语言项目构建容器化开发环境,也将介绍如何使用CMake设置构建系统、使用Unity设置测试环境以及如何在CI流水线中构建容器化环境。

一、现代化开发环境

接下来,我们将展示如何为C项目构建完整的、容器化的开发环境:

  • 创建Docker镜像作为vscode的开发容器;
  • 基于最小化的Dummy库,在容器中设置构建库的工具;
  • 设置静态代码分析器clang-tidy检查代码是否有常见错误;
  • clang-format维持代码库的格式保持正常和整洁;
  • 设置Unity,通过在主机上执行Ceedling测试虚拟函数;
  • 最后,我们将设置GitHub工作流,使用本地Docker镜像执行、构建测试项目。

在本文中,我将使用Docker命令行接口。如果你不明白为什么需要某些参数,建议参考在线文档。你也可以直接打开GitHub上的示例项目。

二、在Docker中运行程序 

有时,使用嵌入式系统C/C++需要安装大量专用工具编译器。如果你正在同时处理不同的项目,版本之间很容易发生冲突。因此,我更倾向于在Docker容器中运行所有程序。

你可以使用Dockerfiles,这能避免在本地安装工具,任何人都能通过预构建镜像本地镜像加入项目。

1.为什么是Docker?存在哪些陷阱?

如果你是Docker新手,需注意以下几点:

  • Dockerfiles不稳定:昨天构建出的Dockerfile今天就可能无法使用,存在太多的外部依赖关系;
  • Docker不是平台独立型的,例如Apple ARM;
  • 某些Docker特性仅在Linux或专用Windows中获得了支持;例如,并非所有平台都支持将USB设备安装到Docker容器之中,这是自2016年以来的限制。

鉴于此,建议你不要将“赌注”“押”在同一项技术上,并且你需要随时做好切换的准备。

2.让我们这样做 

让我们从零开始,构建空存储库

图片

确保安装Dockor并顺利运行,在项目的根目录中创建如下内容:builder.Dockerfile

图片

这个Dockerifle指定了基本镜像并安装了一些包,便于在后续步骤中使用。我不会详细介绍每一个软件包:在创建镜像时,你很快就能注意到缺少了什么,可以扩展软件包列表,重要的是以下几点:

  • 对于基本图像,我强烈建议使用特定标签。apt包在基本镜像之间变化很大,选择标记可以为你节省更多时间;
  • 我倾向于在镜像开发过程中使用特定平台 ,这一点对后续开发步骤的顺利进行很重要。

如果不使用vscode,也可以指定不同的镜像。在本文中,我们将使用vscode,也将坚持使用Dev容器所支持的镜像。

镜像是用如下的命令构建出来的,执行起来可能需要一点时间:

图片

3.详细命令行调用的快捷方式 

Docker命令非常冗长,因此,我通常将常用命令放在makefile项目根目录中。假设安装make后可进行如下操作:

图片

现在,执行如下操作重建镜像:

图片

让我们从图像中旋转容器并进行测试:

图片

当使用apt时,已安装的工具版本取决于基础镜像,也取决于包注册表。如果需要安装特定的版本,可以通过执行自定义的RUN命令。

三、Visual Studio代码开发容器 

没有在本地安装所有工具的缺点是:你选择的IDE无法利用这些工具,例如,当使用vscode时,如果没有安装编译器,你将无法正确设置智能提示或任何其它的辅助程序

vscode允许你在开发容器中运行编辑器。这也是我们选择将mcr.microsoft.com/vscode/devcontainers/base当作基础图像的原因:我们可以在容器中链接到vscode,因此所有工具都将被安装在Docker镜像中。

值得注意的是,vscode实例与本地vscode安装不匹配,与远程实例非常相似。

通过创建.devcontainer/devcontainer.json文件,我们可以让vscode使用新构建的图像作为开发容器,还可以在vscode实例中安装3个扩展,通过使用 customizations.extensions字段中的devcontainer.json配置文件:

图片

如果你从现在开始重新加载窗口或重新打开vscode,vscode应该会询问你是否需要使用检测到的开发容器。

图片

需要一段时间为vscode设置你的容器安装扩展,并用vscode连接到Linux容器

图片

四、系统架构 

我们将使用CMake构建单独的.c和.h对。

图片

图片

CMakeLists.txt简单定义了名为“Dummy”的库,并将相应的文件添加到库中。

重要的是:这已在开发容器和vscode中被构建出来了!在你的远程实例中打开集成终端并执行CMake,如下所示:

图片

五、安装clang工具:格式化和静态代码分析

C和C++的灵活性也伴随着大量“footguns”的出现;因此,我尝试在项目中添加至少一个最小的静态代码分析任务,这有助于发现最明显的错误。市面上有很多工具,但到目前为止,我个人更偏爱clang-tidy。

另外,在代码库上进行协作时,格式化器极好;当我们在安装clang-tidy时,不妨继续安装clang-format。

你需要将两个配置文件clang-format和.clang-tidy放置到项目根目录中,以便任何IDE都能自动拾取它们:

图片

六、添加单元测试框架

我们已经能够构建并分析库,还提供了格式化功能。在开发环境中,我们还需要一个单元测试框架

在本文中,我选择了Unity测试框架,通过Ceedling在主机上执行。顺便说一句,使用这个框架便于嵌入式系统在目标硬件上执行任务。

1.安装Unity和Ceedling 

在构建者镜像的第一步中,我们已经安装了ruby,所以,安装单元测试工具变得更加简单:

图片

重建镜像后,我们就可以开始了!

图片

2.配置Unity和运行单元测试 

简而言之,你需要在一个专门的unity_config.h文件中将配置开关设置为Unity并配置Ceedling与project.yml. Ceedling,为你生成所有的测试运行程序。

你需要做的就是添加你的测试文件,然后“告诉”Ceedling如何检测它们:

图片

然后,我们可以创建第一个单元测试tests/unittest/test/test_dummy.c:

图片

七、结论

到这里,所有的工作就都完成了,包括库的构建等,报告也可以使用了。神奇的是,所有这些操作都不会使计算机因工具而“堵塞”

图片

最后,值得一提的是:有了Docker桌面,你不仅可以轻松检查图像漏洞,还能检查Dockerfile中的每一步:

图片

现在,你已具备在GitHub上用CI设置容器化C/C++项目的所有技能。有了这项技能,你能轻松地在文档中添加特定编译器清理设置CI时出现的所有错误

用工具

成功的前端工程师很会善用工具,这些年低代码概念开始流行,像国外的 Mendix,国内的 JNPF,这种新型的开发方式,图形化的拖拉拽配置界面,并兼容了自定义的组件、代码扩展,确实在 B 端后台管理类网站建设中很大程度上的提升了效率。

开源地址:JNPF体验中心

代码量少,系统的稳定性和易调整性都会得到一定的保障。基于代码生成器,可一站式开发多端使用 Web、Android、IOS、微信小程序。代码自动生成后可以下载本地,进行二次开发,有效提高整体开发效率。同时,支持多种云环境部署、本地部署给予最大的安全保障,可以快速搭建适合自身应用场景的产品。

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

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

相关文章

干翻Dubbo系列第十二篇:Dubbo协议介绍

文章目录 文章说明 一:Dubbo协议 1:Dubbo协议简介 2:Dubbo协议优点 3:Dubbo协议帧的组成 (一):幻数 (二):2Way (三):event (四):Serilization ID (五):status …

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等 一、react-redux介绍二、React-Redux-基本使用三、获取状态useSelector四、分发动作useDispatch五、 Redux 数据流六、代码结构七、ActionType的使用八、Reducer的分离与合并九、购物挣…

python:tkinter + cef 模仿 mdict 界面

cefpython3 其上游是C开发的CEF(基于webkit、V8), CEF 即 (Chromium Embedder Framework), 是基于Google Chromium项目的开源 Web browser控件(WebView)。 可查看github文档:cefpython api pip install cefpython3 c…

信号灯集和共享内存的综合应用小例子

要求:使用信号灯集和共享内存实现:一个进程对共享内存存放数据"Nice to meet you"循环倒置,一个进程循环输出共享内存的内容,要确保倒置一次打印一次。 分析:这两个进程可以写成两个源文件,一个…

回归预测 | MATLAB实现SSA-SVM麻雀搜索算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SSA-SVM麻雀搜索算法优化支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现SSA-SVM麻雀搜索算法优化支持向量机多输入单输出回归预测(多指标,多图)效果一览基…

VCRUNTIME140_1.dll丢失是怎么回事?三个解决方法分享

最近打开软件或者游戏的时出现了以下问题一开始以为是自己手残又误删了什么,重新安装了两次也没有解决,看网上有许多朋友安装其他软件时会出现缺少VCRUNTIME140.dll,其实VCRUNTIME140_1.dll是微软Visual C Redistributable安装包中的一个动态…

AgentBench——AI智能体基准测试和排行榜

如果您有兴趣了解有关如何对AI大型语言模型或LLM进行基准测试的更多信息,那么一种新的基准测试工具Agent Bench已成为游戏规则的改变者。这个创新工具经过精心设计,将大型语言模型列为代理,对其性能进行全面评估。该工具的首次亮相已经在AI社区掀起了波澜,揭示了ChatGPT-4目…

音视频 FFmpeg音视频处理流程

ffmpeg -i test_1920x1080.mp4 -acodec copy -vcodec libx264 -s 1280x720 test_1280x720.flv推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核&am…

修复由于找不到vcruntime140.dll,无法继续执行代码的问题方法

提示“由于找不到 VCRUNTIME140.dll,无法继续执行代码。重新安装程序可能会解决此问题。”,这一般是什么原因导致了这个问题,我们要如何解决? 下面分享一下由于找不到vcruntime140.dll无法继续执行代码的解决方法。 解决方法&…

【C++】C++入门基础:引用详解

本篇继续分享关于C入门的相关知识,有关命名空间、缺省参数和函数重载的部分欢迎阅读我的上一篇文章【C】C入门基础详解(1)_王笃笃的博客-CSDN博客 继续我们的学习 引用 在C语言中我们接触过指针,很多人都或多或少为他感到头痛过…

开源后台管理系统Geekplus Admin

本系统采用前后端分离开发模式,后端采用springboot开发技术栈,mybatis持久层框架,redis缓存,shiro认证授权框架,freemarker模版在线生成代码,websocket消息推送等,后台管理包含用户管理&#xf…

1122.数组的相对排序

目录 一、题目 二、分析代码 一、题目 二、分析代码 核心计数排序&#xff01;&#xff01;&#xff01; class Solution { public: vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {int n arr1.size();int arr1_Max I…

C++ string类详解

⭐️ string string 是表示字符串的字符串类&#xff0c;该类的接口与常规容器的接口基本一致&#xff0c;还有一些额外的操作 string 的常规操作&#xff0c;在使用 string 类时&#xff0c;需要使用 #include <string> 以及 using namespace std;。 ✨ 帮助文档&…

USB隔离器电路分析,SA8338矽塔sytatek电机驱动,源特科技VPS8701,开关电源,电源 大师

一、 USB隔离器电路分析 进行usb隔离可以使用USB隔离模块 ADUM3160 ADUM4160 注意&#xff1a;B0505S 最大带载0.16A&#xff0c;副边需要带载能力需要改变方案 比如移动硬盘至少需要0.5A 用充电宝、18650、设计5V1A输出电源 二、 1A隔离电压方案

【蓝桥杯】[递归]母牛的故事

原题链接&#xff1a;https://www.dotcpp.com/oj/problem1004.html 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 我们列一个年份和母牛数量的表格&#xff1a; 通过观察&#xff0c;找规律&#xff0c;我们发现&#xff1a; 当年份小于等于4时&…

Linux环境下python连接Oracle教程

下载Oracle client需要的 安装包 rpm包下载地址&#xff1a;Oracle官方下载地址 选择系统版本 选择Oracle版本 下载3个rpm安装包 oracle-instantclient12.2-basic-12.2.0.1.0-1.i386.rpm oracle-instantclient12.2-devel-12.2.0.1.0-1.i386.rpm oracle-instantclient12.2-sq…

算法通关村第八关——轻松搞定二叉树的深度和高度问题

1.基础知识 二叉树节点的高度&#xff1a;指从当前节点到叶子节点的最长简单路径边的条数 二叉树节点的深度&#xff1a;指从根节点到当前节点的最长简单路径边的条数 二叉树的深度和高度问题&#xff0c;递归思想的运用很是普遍&#xff0c;有的问题层序遍历也可以解决。 2.最…

PyTorch Lightning:通过分布式训练扩展深度学习工作流

一、介绍 欢迎来到我们关于 PyTorch Lightning 系列的第二篇文章&#xff01;在上一篇文章中&#xff0c;我们向您介绍了 PyTorch Lightning&#xff0c;并探讨了它在简化深度学习模型开发方面的主要功能和优势。我们了解了 PyTorch Lightning 如何为组织和构建 PyTorch 代码提…

3种获取OpenStreetMap数据的方法【OSM】

OpenStreetMap 是每个人都可以编辑的世界地图。 这意味着你可以纠正错误、添加新地点&#xff0c;甚至自己为地图做出贡献&#xff01; 这是一个社区驱动的项目&#xff0c;拥有数百万注册用户。 这是一个社区驱动的项目&#xff0c;旨在在开放许可下向每个人提供所有地理数据。…

基于YOLOv8模型的奶牛目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的奶牛目标检测系统可用于日常生活中检测与定位奶牛目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集…