Linux——Ubuntu环境C编程

时间:2024-11-04 13:23:38

配置vim编辑器

设置一个tab键为4个空格

打开/etc/vim/vimrc文件,此文件为只读,所以要用sudo访问boot权限:

set ts=4(设置一个tab键为4空格)

set nu(vim编辑器下显示行号) 

 gcc编译器

gcc命令

gcc -c main.c(只编译不链接为可执行文件,将main.c文件编译为.o的目标文件)

gcc main.c -o main(-o表示将main.c编译为可执行文件main,如果不加-o,默认编译为a.out的可执行文件)

 

gcc的编译流程:预处理、编译、汇编和链接。预处理就是对程序中的宏定义等相关的内容先进行前期的处理。编译是将经过预编译处理的代码编译成汇编代码,也就是我们常说的程序编译。汇编就是将汇编语言文件编译成二进制目标文件。链接就是将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件。

make工具和Makefile文件

当源码文件比较多的时候就不适合通过直接输入gcc命令来编译,这时候就需要一个自动化的编译工具。

make:一般说GNU Make,是一个软件,用于将源代码文件编译为可执行的二进制文件,make工具主要用于完成自动化编译,make工具编译的时候需要makefile文件提供编译文件。

Makefile:make工具所使用的文件,Makefile指明了编译规则。

Makefile规则格式

Makefile里面是由一系列的规则组成,这些规则格式如下:

下面的规则的目标是main,main.o、input.o和calcu.o是生成main的依赖文件,如果要更新目标main,就必须要先更新它的所有依赖文件,如果依赖文件中的如何一个有更新,那么目标文件也必须更新,“更新”就是执行一遍格则中的命令列表。

命令列表中的每条命令必须以TAB键开始,不能使用空格!!!

make只编译修改过的文件,当我们修改了input.c时再次使用make进行编译时,如下:

删除编译后产生的.o文件和可执行文件main,使用命令make clean:

 

 make的执行过程:

1、make命令会在当前目录下查找以Makefile(makefile也可以)命名的文件。

2、当找到Makefile文件以后就会按照Makefile中定义的规则去编译生成最终的目标文件。

3、当发现目标文件不存在,或者目标文件所依赖的文件比目标文件新(也就是最后修改时间比目标文件晚)的话就会执行后面的命令来更新目标。

        这就是make的执行过程,make工具就是在makefile中一层一层的查找依赖关系,一旦写好了Makefile文件,以后只需要一个make命令即可完成整个工程的编译,极大地提高了开发效率。

#Makefile变量的使用

objects = main.o input.o calcu.o

main: $(objects)

        gcc -o main $(objects)

注意:Makefile的注释符号为#,不能用C语言中的“//”或者“/**/”

在上面的示例中我们使用了“=”对变量进行赋值,Makefile变量的赋值符还有其它两个“:=”和“?=”

1、赋值符“=”

使用“=”在给变量赋值的时候,不一定要用已经定义好的值,也可以使用后面定义的值,比如如下代码:

最终输出:

 “=”赋值符就是变量的真实值取决于它所引用的变量的最后一次有效值。

2、赋值符“:=”

输出:

 

赋值符“:=”不会使用后面定义的变量,只能使用前面已经定义好的,这就是“=”和“:=”的区别。

3、赋值符“?=”

 上述代码的意思就是,如果变量curname前面没有被赋值,那么此变量就是“zhangzhongsheng”,如果前面已经赋值过,那么就使用前面赋的值。

输出:

因为curname前面没有被赋值过,所以赋值为zhangzhongsheng

4、追加赋值“+=”

将+=后面的内容追加到变量后面去 

 

Makefile模式规则

        模式规则中,至少在规则的目标定定义中要包涵“%”,否则就是一般规则,目标中的“%” 表示对文件名的匹配,“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的 文件,类似与通配符,a.%.c 就表示以 a.开头,以.c 结束的所有文件。 当“%”出现在目标中的时候,目标中“%”所代表的值决定了依赖中的“%”值,使用方 法如下:

自动化变量

所谓自动化变量就是这种变量会把模式中所 定义的一系列的文件自动的挨个取出,直至所有的符合模式的文件都取完,自动化变量只应该 出现在规则的命令中,常用的自动化变量如下:

模式规则和自动化变量使用如下:

 Makefile伪目标

 使用伪目标主要是为了避免 Makefile 中定义的执行命令的目标和工作目录下的实际文件出 现名字冲突,有时候我们需要编写一个规则用来执行一些命令,但是这个规则不是用来创建文 件的,比如在前面的Makefile文件中有如下代码用来完成清理工程的功能:

当我们的目录下存在clean文件,我们可以使用伪目标来进行区分:

 Shell脚本

shell仅支持整形,数值计算使用$((表达式))

read表示读入数据,-p后跟提示信息,在输入前进行信息提示。

 test命令

test命令用来查看文件是否存在、权限等信息,可以进行数值、字符、文件三方面的测试。

&&命令和||命令

cmd1&&cmd2 当cmd1执行完毕并正确,那么cmd2开始执行,如果cmd1执行完毕错误,那么cmd2不执行。

cmd1||cmd2 当cmd1执行完毕并正确,那么cmd2不执行,反之cmd2执行。

中括号[ ]判断符

 默认参数

$0~$n 表示shell脚本的参数,包括shell脚本命令本身,shell脚本命名本身为$0

$#:#表示最后一个参数的标号。

$@:表示$1、$2、$3...

执行结果:

条件判断if elif else

if 判断语句; then

        执行语句

elif 判断语句; then

        执行语句

else

        执行语句

fi

 

 case语句

 case $变量 in

        "第一个变量内容")

                程序段

                ;;

        "第二个变量内容")

                程序段

                ;;

esac

 shell脚本函数

函数写法如下:

function fname(){

        //函数代码段

}

执行结果如下:

函数传参:

执行结果:

shell循环

shell脚本也支持循环,比如while do done,表示当条件成立的时候就一直循环,直到条件不成立。

while [条件]  //括号内的状态是判断式

do   //循环开始

        //循环代码段

done

执行结果:

还有另外一种until do done,表示条件不成立的时候循环,条件成立以后就不循环了,写法如下:

until [条件]

do

        //循环代码段

done

for循环,使用for循环可以知道有循环次数,写法

for var con1 con2 con3......

do

        //循环代码段

done

执行结果:

第二个for循环写法:

for((初始值;限制值;执行步长))

do

        //循环代码段

done

执行结果: