linux C编程入门

news2024/11/15 23:26:21
Ubuntu 下也有一些可以进行编程的工具,但是大多都只是编辑器,
也就是只能进行代码编辑,如果要编译的话就需要用到 GCC 编译器,使用 GCC 编译器肯定就
要接触到Makefile。

1:hello world!!!

我们所说的编写代码包括两部分:代码编写和编译,在 Windows 下可以使用 VisualStudio
来完成这两部分,可以在 VisualStudio下编写代码然后直接点击编译就可以了。
C 编译器进行编译,其中代码编写工具很多,比如VIM 编辑器、 Emacs 编辑器、 VScode 编辑器等等

1.1编写代码

先在用户根目录下创建一个工作文件夹: C_Program ,所有的 C 语言练习都保存到这个工
作文件夹下,创建过程如图
为了方便管理,我们后面每个例程都创建一个文件夹来保存所有与本例程有关的文件,创建一个名为“3.1”的文件夹来保存我们的“HelloWorld”程序相关的文件,操作如图

在使用VI编辑器之前我们先做如下设置:

1、设置TAB键为4字节

VI 编辑器默认 TAB 键为 8 空格,我们改成 4 空格,用 vi 打开文件 /etc/vim/vimrc
在终端输入sudu vi /etc/vim/vimrc
在此文件最后面输入如下代码
set ts=4 2 VIM 编辑器显示行号
VIM 编辑器默认是不显示行号的,不显示行号不利于代码查看,我们设置 VIM 编辑器显
示行号,同样是通过在文件 /etc/vim/vimrc 中添加代码来实现

写完set nu 后,不要动,按ESC,然后按冒号,wq

使用 vi 指令创建一个名为“main.c”的文件,然后在里面输入如下代码: 编写完成以后保存退出 vi 编辑器,可以使用“cat”命令查看代码是否编写成功 编译代码
如果输入命令“ gcc -v ”命令以后,你的终端输出类似图 3.1.2.1 中的信息,那么说明你的
电脑已经有 GCC 编译器
如何使用 GCC 编译器来编译 main.c 文件呢? GCC 编译器是命令模式的,因此需要输入命
令来使用 gcc 编译器来编译文件,输入如下命令:
gcc main.c
当编译完成以后会生成一个 a.out 文件,这个 a.out 就是编译生成
的可执行文件,执行此文件看看是否和我们代码的功能一样,执行的方法很简单使用命令:“./+ 可执行文件”,比如本例程就是命令:./a.out
a.out 这个文件的命名是 GCC 编译器自动命名的,那我们能不
能决定编译完生成的可执行文件名字呢?
在使用 gcc 命令的时候加上 -o 来指定生
成的可执行文件名字,比如编译 main.c 以后生成名为“main”的可执行文件,操作如图

2:GCC编译器 

gcc 命令
主要选项如下:
-c 只编译不链接为可执行文件,编译器将输入的 .c 文件编译为 .o 的目标文件。
-o < 输出文件名 > 用来指定编译结束以后的输出文件名,如果不使用这个选项的话 GCC
认编译出来的可执行文件名字为 a.out
-g 添加调试信息,如果要使用调试工具 ( GDB) 的话就必须加入此选项,此选项指示编
译的时候生成调试所需的符号信息。
-O :对程序进行优化编译,如果使用此选项的话整个源代码在编译、链接的的时候都会进
行优化,这样产生的可执行文件执行效率就高。
-O2 -O 更幅度更大的优化,生成的可执行效率更高,但是整个编译过程会很慢。
编译错误警告
使 用 vi 在文件夹“ 3.2 ”中创建一个 main.c 文件,在文件里面输入如下代码:

3:编译流程

  GCC 编译器的编译流程是:预处理、编译、汇编和链接。
预处理就是展开所有的头文件、 替换程序中的宏、解析条件编译并添加到文件中。编译是将经过预编译处理的代码编译成汇编 代码,也就是我们常说的程序编译。汇编就是将汇编语言文件编译成二进制目标文件。链接就 是将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件,链接的时候还会涉 及到静态库和动态库等问题。

2:makefile基础

Makefile 就跟脚本文件一样, Makefile 里面还可以执行系统命令。使用的时候只需要一个 make命令即可完成整个工程的自动编译,极大的提高了软件开发的效率。
作为一个专业的程序员,是一定要懂得 Makefile 的,一是因为在 Linux 下你不得不懂 Makefile ,再就是通过 Makefile 你就能了解整个 工程的处理过程。
Makefile 的引入
新建vi 在终端输入如下命令:
上面命令的意思就是使用 gcc 编译器对 main.c calcu.c input.c 这三个文件进行编译,编
译生成的可执行文件叫做 main 。编译完成以后执行 main 这个程序,测试一下软件是否工作正 常,结果如图
改变编译方法:
第一次编 译工程,我们先将工程中的文件都编译一遍,然后后面修改了哪个文件就编译哪个文件,命令 如下:
假如我们现在修改了 calcu.c 这个文件,只需要将 caclue.c 这一个文件 重新编译成.o 文件,然后在将所有的.o 文件链接成可执行文件即,只需要下面两条命令即可:
但是这样就又有一个问题,如果修改的文件一多,我自己可能都不记得哪个文件修改过了,
然后忘记编译,然后 …… ,为此我们需要这样一个工具:
1 、如果工程没有编译过,那么工程中的所有 .c 文件都要被编译并且链接成可执行程序。
2 、如果工程中只有个别 C 文件被修改了,那么只编译这些被修改的 C 文件即可。
3 、如果工程的头文件被修改了,那么我们需要编译所有引用这个头文件的 C 文件,并且
链接成可执行文件。
很明显,能够完成这个功能的就是 Makefile 了,在工程目录下创建名为 “Makefile” 的文件,
文件名一定要叫做“Makefile”!!!区分大小写的哦! 在 Makefile 文件中输入如下代码:
上述代码中所有行首需要空出来的地方一定要使用“ TAB ”键!不要使用空格键!这是
Makefile 的语法要求
Makefile 编写好以后我们就可以使用 make 命令来编译我们的工程了,直接在命令行中输
入“ make ”即可, make 命令会在当前目录下查找是否存在“ Makefile ”这个文件,如果存在的
话就会按照 Makefile 里面定义的编译方式进行编译,如图
,使用命令“ make ”编译完成以后就会在当前工程目录下生成各种 .o 和可
执行文件,说明我们编译成功了。使用 make 命令编译工程的时候可能会提示如图
错误来源一般有两点 :
1 Makefile 中命令缩进没有使用 TAB 键!
2 VI/VIM 编辑器使用空格代替了 TAB 键,修改文件 /etc/vim/vimrc ,在文件最后面加上如
下所示代码:
set noexpandtab
我们修改一下 input.c 文件源码,随便加几行空行就行了,保证 input.c 被修改过即可,修改
完成以后再执行一下“make”命令重新编译一下工程,结果如图
总结一下 Make 的执行过程:
1 make 命令会在当前目录下查找以 Makefile(makefile 其实也可以 ) 命名的文件。
2 、当找到 Makefile 文件以后就会按照 Makefile 中定义的规则去编译生成最终的目标文件。
3 、当发现目标文件不存在,或者目标所依赖的文件比目标文件新 ( 也就是最后修改时间比
目标文件晚 ) 的话就会执行后面的命令来更新目标。
Makefile 的好处就是“自动化编译”,一旦写好了 Makefile
文件,以后只需要一个 make 命令即可完成整个工程的编译,极大的提高了开发效率。

3:Makefile 变量

C 语言一样 Makefile 也支持变量的,先看一下前面的例子:

 

main.o input.o calcue.o 这三个依赖文件,我们输入了两遍,我们
这个 Makefile 比较小,如果 Makefile 复杂的时候这种重复输入的工作就会非常费时间,而且非
常容易输错,为了解决这个问题,Makefile 加入了变量支持。
1 行是注释, Makefile 中可以写注释,注释开头要
用符号“ # ”,不能用 C 语言中的“ // ”或者“ /**/ ”!第 2 行我们定义了一个变量 objects ,并且
给这个变量进行了赋值,其值为字符串“ main.o input.o calcu.o ”,第 3 4 行使用到了变量 objects , Makefile 中变量的引用方法是“ $( 变量名 ) ”,比如本例中的“ $(objects) ”就是使用变量 objects。
我们在定义变量 objects 的时候使用“ = ”对其进行了赋值, Makefile
变量的赋值符还有其它两个“ := ”和“ ?= ”,我们来看一下这三种赋值符的区别:
1 、赋值符“=”
1 行定义了一个变量 name ,变量值为“ zzk ”,第 2 行也定义
了一个变量 curname
curname 的变量值引用了变量 name ,按照我们 C 写语言的经验此时 curname
的值就是“ zzk ”。第 3 行将变量 name 的值改为了“ zuozhongkai ”,第 5 6 行是输出变量 curname
的值。在 Makefile 要输出一串字符的话使用“ echo ”,就和 C 语言中的“ printf ”一样,第 6
中的“ echo ”前面加了个“ @ ”符号,因为 Make 在执行的过程中会自动输出命令执行过程,在
命令前面加上“ @ ”的话就不会输出命令执行过程,大家可以测试一下不加“ @ ”的效果。使用
命令“make print”来执行上述代码,结果如图
2 、赋值符“:=” 修改完成以后重新执行一下 Makefile 可以看到此时的 curname zzk ,不是 zuozhongkai 了。这是因为赋值符“ :=”不会使用后面定义的变量,只能使用前面已经定义好的,这就是“ = ”和“ := ”两个的区别。
3 、赋值符“?=” 4 、变量追加“ +=
Makefile 中的变量是字符串,有时候我们需要给前面已经定义好的变量添加一些字符串进
去,此时就要使用到符号“+=”,比如如下所示代码:
一开始变量 objects 的值为“ main.o input.o ”,后面我们给他追加了一个“ calcu.o ”,因此变
objects 变成了“ main.o input.o calcu.o ”,这个就是变量的追加。

4:Makefile 模式规则 

我们编写了一个 Makefile 文件用来编译工程
上述 Makefile 中第 3~8 行是将对应的 .c 源文件编译为 .o 文件,每一个 C 文件都要写一个对
应的规则,如果工程中 C 文件很多的话显然不能这么做。为此,我们可以使用 Makefile 中的模
式规则,通过模式规则我们就可以使用一条规则来将所有的 .c 文件编译为对应的 .o 文件。
模式规则中,至少在规则的目标定定义中要包涵“ % ”,否则就是一般规则,目标中的“ %
表示对文件名的匹配,“ % ”表示长度任意的非空字符串,比如“ %.c ”就是所有的以 .c 结尾的
文件,类似与通配符, a.%.c 就表示以 a. 开头,以 .c 结束的所有文件。
当“ % ”出现在目标中的时候,目标中“ % ”所代表的值决定了依赖中的“ % ”值,使用方 法如下:
Makefile 条件判断
上述用法中都是用来比较“参数 1 ”和“参数 2 ”是否相同,如果相同则为真,“参数 1 ”和
“参数 2 ”可以为函数返回值。 ifneq 的用法类似,只不过 ifneq 是用来了比较“参数 1 ”和“参
2 ”是否不相等,如果不相等的话就为真。

5:Makefile 函数使用

使用符号“ $ ”来标识。参数集合是函数的多个 参数,参数之间以逗号“, ”隔开,函数名和参数之间以“空格”分隔开,函数的调用以“ $ ”开 头。

1、函数 subst

把字符串“ my name is zzk ”中的“ zzk ”替换为“ ZZK ”,替换完成以后的字符串为“ my name
is ZZK ”。
2 、函数 patsubst
函数 patsubst 用来完成模式字符串替换,使用方法如下:
$(patsubst <pattern>,<replacement>,<text>)
此函数查找字符串 <text> 中的单词是否符合模式 <pattern> ,如果匹配就用 <replacement>
替换掉, <pattern> 可以使用通配符“ % ”,表示任意长度的字符串,函数返回值就是替换后的字 符串。如果<replacement> 中也包涵“ % ”,那么 <replacement> 中的“ % ”将是 <pattern>中的那个 “%”所代表的字符串,
3、函数 dir 4 、函数 notdir
5、函数 foreach 6、函数 wildcard

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

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

相关文章

Compose | UI组件(十四) | Navigation-Data - 页面导航传递数据

文章目录 前言传参流程实例说明普通方式传值定义接受参数格式定义接受参数类型获取参数传入参数传参和接受参数效果图 结合 ViewModel 传递参数定义ViewModel在 navigation 定义 ViewModel 实例&#xff0c;并且传入 LoginScreen传入输入框中的值&#xff0c;并且跳转传值获取值…

计算机今年炸了99%的人都踩了这个坑

24年408考研&#xff0c;如果只用王道的复习资料&#xff0c;最多考100-120分 就是这么的现实&#xff0c;王道的资料虽然好&#xff0c;但是并不能覆盖全部的知识点和考点&#xff0c;而且24年的408真题考的很怪&#xff0c;总结起来就是下面这些特点&#xff1a; 偏&#x…

2024年【G2电站锅炉司炉】模拟试题及G2电站锅炉司炉考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G2电站锅炉司炉模拟试题是安全生产模拟考试一点通生成的&#xff0c;G2电站锅炉司炉证模拟考试题库是根据G2电站锅炉司炉最新版教材汇编出G2电站锅炉司炉仿真模拟考试。2024年【G2电站锅炉司炉】模拟试题及G2电站锅炉…

「数据结构」八大排序2:快排、归并排序

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;初阶数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 八大排序2 &#x1f349;快速排序&#x1f34c;霍尔版本&#x1f34c;挖坑法&#x1f34c;前后指针法 &#x1f349;快排优化&am…

Docker 容器监控-CIG

目录 一、CIG说明 1. CAdvisor 2. InfluxDB 3. Grafana 二、环境搭建 1. 创建目录 2. 编写 docker-compose.yml 3. 检查并运行容器 三、进行测试 1. 查看 influxdb 存储服务 是否能正常访问 2. 查看 cAdvisor 收集服务能否正常访问 3. 查看 grafana 展现服务&#…

服装设计公司,如何用钉钉实现企业数字化成功转型?

钉钉作为数字化工作平台&#xff0c;为某服装设计公司实现了组织管理的数字化转型&#xff0c;构建了一站式的工作平台。通过钉钉赋能&#xff0c;有利于企业推进组织架构、员工沟通、产品运营和客户服务等方面的数字化、智能化转型。 借助钉钉平台&#xff0c;该服设公司轻松实…

澳福实例说明真实交易中止损单和限价单的区别

很多投资者不明白止损单和限价单的区别&#xff0c;今天澳福就举一个例子来说明真实交易中止损单和限价单的区别。 紫色椭圆显示了在欧元兑美元图表上的位置&#xff0c;在不稳定的增长之后&#xff0c;澳福 外汇看到了另一波修正&#xff0c;没有看涨的迹象。同时也发现从历史…

MOS管防反接电路设计

电子元件大都是使用直流工作&#xff0c;电源线反接就有可能就会烧坏&#xff0c;那电路如何防反接&#xff1f;首当其冲我们想到的就是二极管了&#xff0c;运用其单向导通特性可有效防止电源反接而损坏电路&#xff0c;但是随之而来的问题是二极管存在PN节电压&#xff0c;通…

协同算法的无人机集群控制理论技术分析,无人机集群飞行技术详解

随着无人机技术的普及和发展&#xff0c;无人机集群控制也逐渐成为了研究热点之一。而协同算法是实现无人机集群控制的重要手段之一。 在无人机集群控制中&#xff0c;协同算法确实是非常关键的部分。这些算法帮助无人机在复杂的飞行环境中保持队形&#xff0c;同时避免碰撞&a…

Python调用matlab程序

matlab官网&#xff1a;https://ww2.mathworks.cn/?s_tidgn_logo matlab外部语言和库接口&#xff0c;包括 Python、Java、C、C、.NET 和 Web 服务。 matlab和python的版本 安装依赖配置 安装matlab的engine 找到matlab的安装目录&#xff1a;“xxx\ extern\engines\python…

提示由于找不到msvcp120dll无法继续执行此代码怎么办

在计算机系统中&#xff0c;MSVCP120.dll是一个至关重要的动态链接库文件&#xff0c;它是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序运行至关重要。当系统提示“msvcp120dll丢失”时&#xff0c;意味着该文件可能由于误删…

收到微信发的年终奖。。。

大家好&#xff0c;我是小悟 还剩一天就过除夕了&#xff0c;很多单位都已经放假了&#xff0c;街上的人越来越少&#xff0c;门店关着的很多&#xff0c;说明大家都陆陆续续回自己的家乡过年了。 或许你还在搬砖&#xff0c;坚守节前最后一波工作&#xff0c;或许你正在回家的…

必收藏!第六版CCF推荐会议C类国际学术会议!(中国计算机学会)

中国计算机学会 中国计算机学会&#xff08;CCF&#xff09;是全国性、学术性、非营利的学术团体&#xff0c;由从事计算机及相关科学技术领域的个人和单位自愿组成。作为独立社团法人&#xff0c;CCF是中国科学技术协会的成员之一&#xff0c;是全国一级学会&#xff01; CCF的…

算法——前缀和算法

1. 什么是前缀和算法 前缀和算法&#xff08;Prefix Sum&#xff09;是一种用于快速计算数组元素之和的技术。它通过预先计算数组中每个位置前所有元素的累加和&#xff0c;将这些部分和存储在一个新的数组中&#xff0c;从而在需要计算某个区间的和时&#xff0c;可以通过简单…

电脑没有声音是怎么回事?几招快速解决

当电脑突然失去声音&#xff0c;这可能成为一种令人烦恼的体验&#xff0c;尤其是在你期望享受音乐、观看视频或进行在线会议的时候。幸运的是&#xff0c;大多数时候&#xff0c;电脑没有声音的问题是可以迅速解决的。电脑没有声音是怎么回事&#xff1f;本文将为你介绍一些常…

2024.2.7日总结(小程序开发4)

页面导航 页面导航是页面之间的相互跳转&#xff1a; <a>链接location.href 小程序中实现页面导航的两种方式&#xff1a; 声明式导航 在页面上声明一个<navigator>导航组件通过点击<navigator>组件实现页面跳转 编程式导航 调用小程序的导航API&…

【数据结构与算法】二叉树(Binary Tree)

相关推荐&#xff1a;堆&#xff08;Heap&#xff09; / 堆排序&#xff08;HeapSort&#xff09; / TopK 文章目录 1.树1.1 树相关概念1.2 举例树的应用 2. 二叉树2.1 二叉树分类2.2 特殊的二叉树2.3 二叉树的存储结构 3. 二叉树实现与热门问题 1.树 树是一种非线性的数据结构…

详解C++类和对象(下)完结篇

文章目录 写在前面1. 进一步认识构造函数1.1 初始化列表1.2 初始化列表的特性1.3 explicit关键字 2. static成员变量和static成员函数2.1 static成员的概念2.2 static成员的特性 3. 友元3.1 友元函数3.1 友元类 4. 内部类5.匿名对象 写在前面 本篇文章详细介绍了C类和对象中几…

基于SpringBoot+Vue的校园博客管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

计算机网络-华为无线网络配置

前面已经大致了解了无线通信的原理和无线组网的概念&#xff0c;今天来学习无线的配置过程与步骤。 一、无线组网配置流程 在开始配置前复习下前面讲过无线组网有涉及几个设备&#xff0c;AC无线控制器、AP无线接入点、POE交换机。无线组网与有线组网是相对独立的&#xff0c;不…