当前位置: 首页 > news >正文

linux -c程序开发

目的是在linux中创建可执行的c语言程序的步骤 和gcc,make和git的简单运用

建立可执行程序的步骤:


-1:预处理:

--:头文件展开;--去掉注释;--宏替换;--条件编译

-2:编译

--:将预处理之后的c语言替换为汇编语言带阿米

--:语法分析,语义分析,代码生成

--:检查语法正确性并且优化代码

-3:汇编:

--:将汇编代码转化为机器码

--:生成二进制文件,包含机器码和辅助信息

-4:链接

--:将多个目标文件和库文件合并为一个可执行文件

--:解析符号表,处理外部引用

使用gcc编译c语言程序:

GNU C编译器,是linux通用c语言编译器

语法格式: gcc [-选项] 文件

没有选项直接生成可执行文件

常用的选项:

E 只是预处理源文件,不编译

S 编译到汇编,生产汇编代码文件

c 编译到目标文件阶段,但是不链接(二进制文件,可以使用 objdump反汇编查看汇编代码)

o 根据编译阶段指定的输出到文件名

项目编译工具:make

为了解决:源代码关系维护苦难(把代码维护命令和编译命令卸载makefile中,利用make工具去解析文件自动执行相关的命令),减少重复编译时间(只对改动后的文件重新编译,重新链接后,可以快速看到效果)

makefile文件:这个是mkae依赖文件

特殊文本文件,包含指令和信息,详细描述了项目结果,文件间关系,编译参数设置,等待makefile编写完成,就可以实现大型项目的编译链接,清理工作

make的原理:解析makefile文件,根据目标及其依赖关系,构建依赖图,并自动执行相应的构建命令

makefile文件有若干规则,目标,依赖和命令

目标是:要产生的文件名称和动作名称

依赖文件是:用于产生目标文件的输入文件

命令是:make执行的动作,多个命令时一个占一行

make的语法规则:
make [-f 文件] [目标]

运行命令的时候,默认找:GNUmakefile /makefile / Makefile /当然也可以 -f指定

目标,如果没有指定目标就会构建第一个目标然后退出,如果有多个,就会按顺序去构建目标及其依赖关系

实例:编译软件 hello

在makefile中,如下定义

hello: hello.c

gcc -o hello hello.c

说明了hello 依赖:hello.c,hello通过gcc -o hello hello.c得来

实例2:

要编译cal软件,那么我们的makefile如下

cal 依赖与cal.o,mul.o,div.o

通过命令 gcc cal.o mul.o div.o -o cal 生成

下面的解释同上

最后的clean目标是伪目标,不依赖与任何文件

rm *.o是.o后缀文件

第一次的make会全部编译一次

但是如果第二次进行make,因为没有改变就不会有任何提示信息

如果我们通过touch,修改了创建时间,那么就会只编译修改部分

使用 make clean就可以删除所有的.o文件

Git

用于高效的处理各种规模的项目版本管理任务,开发者通过git命令来执行项目版本管理和各项操作

1,工作目录,在电脑中的目录,用于项目开发,进行文件编辑,添加和删除

2,暂存区,在本地仓库和工作目录之间的,允许用户在提交前进行组织,检查

3,本地仓库负责存储用户的所有提交,分支,标签,版本控制的核心,使得用户可以回顾历史版本,修改,创建,切换分支,或者添加标签

4,远程仓库,托管在平台or服务器上面的软件库,包含了源代码,历史记录,分支信息,配置文件,可以推送本地仓库修改,拉去仓库最新版本等

常见命令

git clone [远程仓库的链接]

git add [文件/目录]//将文件加入到暂存区

git commit -m "说明信息"//将暂存区的内容提交

git push [远程仓库] [本地分支]//把本地分支提交到远程目录

git pull [远程仓库] [分支] //拉取远程仓库的分支

git branch //列出所有本地分支

git branch name //创建一个分支

git checkuot 分支名 //切换到对应的分支

git branch -d [分支] //删除分支

git status //仓库的状态

git log //git的提交记录

git config //查看和修改git配置

当然更多的你可以去Learn Git Branching学习更多

相关文章:

  • 第八节:图像基本操作- 图像颜色空间转换 (RGB, HSV)
  • Android Service 从 1.0 到 16 的演进史
  • 小游戏(2)扫雷游戏
  • 小芯片大战略:Chiplet技术如何重构全球半导体竞争格局?
  • Laravel 12 基于 EMQX 实现 MQTT 消息发送与接收
  • Linux云计算训练营笔记day02(Linux、计算机网络、进制)
  • 信息论05:信息论中的条件熵——从不确定性量化到机器学习实战
  • java每日精进 5.06【框架之功能权限】
  • java安全入门
  • AI技术下研发体系重构
  • 登高架设作业“十不登高”原则
  • SSCLMD项目详细分析
  • colcon: error: unrecognized arguments: --packages-select报错
  • vs code管理员权限启动问题
  • 最新版Google浏览器加载ActiveX控件之VLC五一节特别版
  • 【Linux系统】读写锁
  • QT Sqlite数据库-教程03 插入数据-下
  • 如何修改 JAR 包中的源码
  • 设备管理系统的功能架构与核心价值
  • MATLAB程序演示与编程思路,相对导航,四个小车的形式,使用集中式扩展卡尔曼滤波(fullyCN-EKF)
  • 外交部回应西班牙未来外交战略:愿与之一道继续深化开放合作
  • 日本儿童人数已连续44年减少,少子化问题越发严重
  • 视频丨054B型护卫舰钦州舰南海实战化训练
  • 马上评|提供情绪价值,也是文旅经济的软实力
  • “彩虹滑道”项目两男童相撞飞跌出去,景区:工作人员误判导致
  • “矿茅”国际化才刚开始?紫金矿业拟分拆境外黄金矿山资产于港交所上市