99网
您的当前位置:首页Linux C语言编程基础命令

Linux C语言编程基础命令

来源:99网

一、hello world

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

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
	······

五、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
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

九、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<names···>
$(dir</src/a.c>)

函数notdir

$(notdir<names···>

例如:

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

5、函数foreach

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

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

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

函数wildcard

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

$(wildcard PATTERN···)

比如:

$(wildcard *.c)

因篇幅问题不能全部显示,请点此查看更多更全内容