自学内容网 自学内容网

GCC 编译器,Makefile基础 cmake基础

一、主要命令

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

二、Makefile基础

1、“=”的使用

name = zzk
curname = $(name)
name = zuozhongkai

print:
        @echo curname: $(curname)

2、“:=”的使用

name = zzk
curname := $(name)
name = zuozhongkai

print:
    @echo curname: $(curname)

3、赋值符“?=”

“?=”是一个很有用的赋值符,比如下面这行代码:
curname ?= zuozhongkai
上述代码的意思就是,如果变量 curname 前面没有被赋值,那么此变量就是“zuozhongkai”,
如果前面已经赋过值了,那么就使用前面赋的值。

4、变量追加“+=”

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

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

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

5、自动变量

6、Makefile伪目标

objects = main.o input.o calcu.o
main: $(objects)
gcc -o main $(objects)

.PHONY : clean

%.o : %.c
gcc -c $<

clean:
 rm *.o
 rm main

7、Makefile条件判断

在 C 语言中我们通过条件判断语句来根据不同的情况来执行不同的分支, Makefile 也支持条件判断,语法有两种如下:

 

ifeq 用法如下:

ifdef 和 ifndef 的用法如下:
 

ifdef <变量名>

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

8、Makefile函数使用

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

$(函数名 参数集合)


或者:
 

${函数名 参数集合}

1)函数subst

函数 subst 用来完成字符串替换,调用形式如下:
$(subst <from>,<to>,<text>)
此函数的功能是将字符串<text>中的<from>内容替换为<to>,函数返回被替换以后的字符
串,比如如下示例:
$(subst zzk,ZZK,my name is zzk)

把字符串“my name is zzk”中的“zzk”替换为“ZZK”,替换完成以后的字符串为“my name
is ZZK”。
2) 函数patsubst

函数 patsubst 用来完成模式字符串替换,使用方法如下:
$(patsubst <pattern>,<replacement>,<text>)
此函数查找字符串<text>中的单词是否符合模式<pattern>,如果匹配就用<replacement>来
替换掉, <pattern>可以使用通配符“%”,表示任意长度的字符串,函数返回值就是替换后的字
符串。如果<replacement>中也包涵“%”,那么<replacement>中的“%”将是<pattern>中的那个
“%”所代表的字符串,比如:
$(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…>)
此函数用来从文件名序列<names>中提取出目录部分,返回值是文件名序列<names>的目录
部分,比如:
$(dir </src/a.c>)
提取文件“/src/a.c”的目录部分,也就是“/src”

4)函数nodir

函数 notdir 看名字就是知道去除文件中的目录部分,也就是提取文件名,用法如下:
$(notdir <names…>)
此函数用与从文件名序列<names>中提取出文件名非目录部分,比如:
$(notdir </src/a.c>)
提取文件“/src/a.c”中的非目录部分,也就是文件名“a.c”。

5)函数foreach

foreach 函数用来完成循环,用法如下:
$(foreach <var>, <list>,<text>)
此函数的意思就是把参数<list>中的单词逐一取出来放到参数<var>中,然后再执行<text>所
包含的表达式。每次<text>都会返回一个字符串,循环的过程中, <text>中所包含的每个字符串
会以空格隔开,最后当整个循环结束时, <text>所返回的每个字符串所组成的整个字符串将会是
函数 foreach 函数的返回值。

6)函数 wildcard

通配符“%”只能用在规则中,只有在规则中它才会展开,如果在变量定义和函数使用时,
通配符不会自动展开,这个时候就要用到函数 wildcard,使用方法如下:
$(wildcard PATTERN…)
比如:
$(wildcard *.c)
上面的代码是用来获取当前目录下所有的.c 文件,类似“%”。


 



 


 


原文地址:https://blog.csdn.net/wangxu696200/article/details/143932303

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!