Linux C语言编程基础命令

一、hello world

1.设置vi编辑器TAB键为4空格
打开vim文件后,输入

set ts=4

2.VIM编辑器显示行号

set nu

3.查看GCC编译器版本号

gcc -v

4.使用GCC编译器编译main.c文件

gcc main.c

5.执行编译生成的可执行文件a.out

./a.out

6.指定编译生成的可执行文件名字

gcc main.c -o main // 指定编译生成的可执行文件名字为main

二、GCC编译器

1.gcc 命令格式如下:

gcc [选项] [文件名字]

主要选项如下:

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

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

三、Makefile

创建名为 “Makefile”文件,
1.文件名必须是**“Makefile”**区分大小写
2.代码中所有行首需要空出来的地方一定要使用“TAB”键,这是Makefile的语法要求
set noexpandtab 可用此代码来解决
make 命令会为 Makefile 中的每个以 TAB 开始的命令创建一个 Shell 进程去执行。

1 main: main.o input.o calcu.o
2 	gcc -o main main.o input.o calcu.o
3 main.o: main.c
4 	gcc -c main.c
5 input.o: input.c
6 	gcc -c input.c
7 calcu.o: calcu.c
8 	gcc -c calcu.c
9 
10 clean:
11	 rm *.o
12	 rm main

3.Makefile编写好后,使用make命令来编译工程

四、Makefile语法

1.规则:

目标:依赖文件集合······
	命令1
	命令2
	······

2.make 命令会为 Makefile 中的每个以 TAB 开始的命令创建一个 Shell 进程去执行。
3.clean:想要执行 clean 的话可以直接使用命令“make clean”,执行以后就会删除当前目录下所有的.o 文件以及 main,因此 clean 的功能就是完成工程的清理
4.make执行过程:
1、make 命令会在当前目录下查找以 Makefile(makefile 其实也可以)命名的文件。
2、当找到 Makefile 文件以后就会按照 Makefile 中定义的规则去编译生成最终的目标文件。
3、当发现目标文件不存
5.总结
Makefile 中规则用来描述在什么情况下使用什么命令来构建一个特定的文件,
这个文件就是规则的“目标”,为了生成这个“目标”而作为材料的其它文件称为“目标”的依
赖,规则的命令是用来创建或者更新目标的。
除了 Makefile 的“终极目标”所在的规则以外,其它规则的顺序在 Makefile 中是没有意义
的,“终极目标”就是指在使用 make 命令的时候没有指定具体的目标时,make 默认的那个目
标,它是 Makefile 文件中第一个个规则的目标,如果 Makefile 中的第一个规则有多个目标,那么
这些目标中的第一个目标就是 make 的“终极目标”。

五、Makefile 变量

1.Makefile中的变量都是字符串,类似C语言的宏。

1 #Makefile 变量的使用
2 objects = main.o input.o calcu.o
3 main: $(objects)
4 gcc -o main $(objects)

注释开头用符号“#”

第2行定义了一个变量objects,并且给这个变量进行了赋值,其值为字符串“main.o input.o calcu.o”

Makefile中变量的引用方法是“$(变量名)”

赋值符“=”

1 name = abc
2 curname = $(name)
3 name = def
4
5 print:
6 @echo curname: $(curname)

6.Makefile输出一串字符:

echo 相当于C语言中的printf

@,Make在执行过程中会自动输出命令执行过程,在命令前面加上“@”就不会输出命令执行过程

使用命令“make print”来执行上述代码,输出结果为“curname: def”,也就是变量“name”

最后一次赋值的结果。也就是变量的真实值取决于它所引用的变量的最后一次有效值。
9.

赋值符 “:=”

10.输出结果为“curname:abc”,赋值符“:=”不会使用后面定义的变量,只能使用前面已经定义好的
11.

赋值符"?="

curname?=abc
如果变量curname前面没有被赋值,那么此变量就是“abc”,如果前面已经赋过值了,那么就是用前面赋的值。
12.

变量追加“+=”

Makefile中的变量是字符串,有时候我们需要给前面已经定义好的变量添加一些字符串进去,此时就要使用到符号“+=”

objects = main.o inpiut.o
objects+=calcu.o

一开始变量 objects 的值为“main.o input.o”,后面我们给他追加了一个“calcu.o”,因此变
量 objects 变成了“main.o input.o calcu.o”,这个就是变量的追加。

六、Makefile模式规则

%

目标中的“%”表示对文件名的匹配,“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的文件,类似与通配符,a.%.c 就表示以 a.开头,以.c 结束的所有文件。
%.o:%.c

七.Makefile自动化变量

$@

规则中的目标集合,在模式规则中,如果有多个目标的话,“$@”表示匹配模式中定义的目标集合。
2.

$%

当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,那么其值为空。
3.

$<

依赖文件集合中的第一个文件,如果依赖文件是以模式(即“%”)定义的,那么“$<”就是符合模式的一系列的文件集合。
4.

$?

所有比目标新的依赖目标集合,以空格分开。
5.

$^

所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,“$^”会去除重复的依赖文件,值保留一份。
6.

$+

和“$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。
7.

$*

这个变量表示目标模式中"%"及其之前的部分,如果目标是 test/a.test.c,目标模式为 a.%.c,那么“$*”就是 test/a.test。

八、Makefile伪目标

clean:
	rm *.o
	rm main

上述规则中并没有创建文件 clean 的命令,因此工作目录下永远都不会存在文件 clean,当
我们输入“make clean”以后,后面的“rm *.o”和“rm main”总是会执行。可是如果我们“手
贱”,在工作目录下创建一个名为“clean”的文件,那就不一样了,当执行“make clean”的时
候,规则因为没有依赖文件,所以目标被认为是最新的,因此后面的 rm 命令也就不会执行,我
们预先设想的清理工程的功能也就无法完成。为了避免这个问题,我们可以将 clean 声明为伪
目标,声明方式如下:
.PHONY:clean

1 objects = main.o input.o calcu.o
2 main: $(objects)
3 gcc -o main $(objects)
4 
5 .PHONY : clean
6 
7 %.o : %.c
8 gcc -c $<
9 
10 clean:
11 rm *.o
12 rm main

上述代码第 5 行声明 clean 为伪目标,声明 clean 为伪目标以后不管当前目录下是否存在名
为“clean”的文件,输入“make clean”的话规则后面的 rm 命令都会执行。

九、Makefile条件判断

语法有两种:
1.

<条件关键字>
	<条件为真时执行的语句>
endif
<条件关键字>
	<条件为真时执行的语句>
else
	<条件为假时执行的语句>
endif

其中条件关键字有 4 个:ifeq、ifneq、ifdef 和 ifndef,
这四个关键字其实分为两对、
ifeq 与ifneq、ifdef 与 ifndef,
先来看一下 ifeq 和 ifneq,ifeq 用来判断是否相等,
ifneq 就是判断是否不相等,ifeq 用法如下:

ifeq (<参数 1>, <参数 2>)
ifeq ‘<参数 1 >,<参数 2>’
ifeq “<参数 1>,<参数 2>”
ifeq “<参数 1>,<参数 2>’
ifeq ‘<参数 1>,<参数 2>

上述用法中都是用来比较“参数 1”和“参数 2”是否相同,如果相同则为真,“参数 1”和“参数 2”可以为函数返回值。ifneq 的用法类似,只不过 ifneq 是用来了比较“参数 1”和“参数 2”是否不相等,如果不相等的话就为真。
ifdef 和 ifndef 的用法如下:

ifdef <变量名>
如果“变量名”的值非空,那么表示表达式为真,否则表达式为假。“变量名”同样可以是一个函数的返回值。ifndef 用法类似,但是含义用户 ifdef 相反。

十、Makefile函数使用

Makefile 中的函数是已经定义好的,我们直接使用,不支持我们自定义函数。make 所支持的函数不多,但是绝对够我们使用了,函数的用法如下:

$(函数名 参数集合)

或者:

${函数名 参数集合}

可以看出,调用函数和调用普通变量一样,使用符号“ ”来标识。参数集合是函数的多个参数,参数之间以逗号“ , ”隔开,函数名和参数之间以“空格”分隔开,函数的调用以“ ”来标识。参数集合是函数的多个参数,参数之间以逗号“,”隔开,函数名和参数之间以“空格”分隔开,函数的调用以“ 来标识。参数集合是函数的多个参数,参数之间以逗号,隔开,函数名和参数之间以空格分隔开,函数的调用以”开头
1、

函数 subst

函数 subst 用来完成字符串替换,调用形式如下:

$(subst <from>,<to>,<text>)

此函数的功能是将字符串 中的内容替换为,函数返回被替换以后的字符串
2、

函数 patsubst

函数 patsubst 用来完成模式字符串替换,使用方法如下:

$(patsubst <pattern>,<replacement>,<text>)

此函数查找字符串 中的单词是否符合模式,如果匹配就用来
替换掉,可以使用通配符“%”,表示任意长度的字符串,函数返回值就是替换后的字
符串。如果中也包涵“%”,那么中的“%”将是中的那个
“%”所代表的字符串,比如:

$(patsubst %.c,%.o,a.c b.c c.c)

将字符串“a.c b.c c.c”中的所有符合“%.c”的字符串,替换为“%.o”,替换完成以后的字符串为“a.o b.o c.o”。
3、

函数dir

函数dir用来获取目录,使用方法如下:

$(dir<names···>

此函数用来从文件名序列中提取出目录部分,返回值是文件名序列的目录部分,比如:

$(dir</src/a.c>)

提取文件“/src/a.c”的目录部分,也就是“/src”
4、

函数notdir

去除文件中的目录部分,也就是提取文件名

$(notdir<names···>

例如:

$(notdir</src/a.c>)

提取文件“/src/a.c”中的非目录部分,也就是文件名“a.c”。

5、函数foreach

foreach函数用来完成循环,用法如下:

$(foreach<var>,<list>,<text>)

此函数的意思就是把参数中的单词逐一取出来放到参数中,然后再执行 所包含的表达式。每次 都会返回一个字符串,循环的过程中, 中包含的每个字符串都会以空格隔开,最后当整个循环结束时, 所返回的每个字符串所组成的整个字符串将会是函数foreach函数的返回值。
6.

函数wildcard

通配符“%”只能用在规则中它才会展开,如果在变量定义和函数使用时,通配符不会自动展开,这个时候就要用到函数wildcard,使用方法如下:

$(wildcard PATTERN···)

比如:

$(wildcard *.c)

上面的代码时用来获取当前目录下所有的.c文件,类似“%”。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值