c++ makefile和cmake

makefile指在目录下叫做Makefile的文件,由make工具进行解释执行。在文件的编译过程中,首先将源代码编译生成中间文件.o,这个阶段只检测语法,如果源文件较多,那么Object File也会较多,此时将这些Object File链接合成一个执行文件的过程会变得比较繁琐。

为了提高编译速度,需要对没有编译过的或者更新了的源文件进行编译,其他的直接链接中间目标文件。当头文件更改了时,我们还需要重新编译引用了更改过的头文件的文件。上面所说的通过make命令和我们编写的makefile就可以完成。

简单来说,makefile就是一个纯手动的IDE,通过手写编译规则和依赖来配合make命令提高编译工作效率。make会先读入所有include的makefile,将各文件中的变量做初始化,分析语法规则,创建依赖关系链,依据此关系链来判定所需要生成的文件。

makefile的语法规则如下:

target ... : prerequisites ...
    command
    ...
    ...

其中的target可以是一个目标文件,也可以是一个可执行文件,还可以是一个label。prerequisites表示target所依赖的文件或者是target(?)。prerequisites的文件或target只要有一个更新了,对应的后面的command就会执行。command就是这个target要执行的shell命令。

举个例子,我们首先写一个main.c:

#include<stdio.h>
#include"foo.h"

int main(){
	printf("Hi \n");
	sayHey();
	return 0;
}

接下来我们写一个foo.c:

#include"foo.h"

void sayHey(){
	print("Hey! \n");
}

补上对应的foo.h:

void sayHey();

接下来我们写一个makefile:

hi: main.o foo.o
	cc -o hi main.o foo.o

main.o: main.c foo.h
	cc -c main.c

foo.o: foo.c foo.h
	cc -c foo.c

clean:
	rm hi main.o foo.o

在该目录下直接输入make就能生成hi可执行文件,如果想要清除掉生成的可执行文件和中间目标文件,只要执行make clean就可以了。

上面代码中冒号后的.c和.h文件就是表示依赖的prerequisites。我们可以发现main.o foo.o字符串重复了两次,这种重复多次的代码块可以进行简化,类似C语言中的变量,在makefile中的写法如下:

object = main.o foo.o

使用这个变量的语法是$(objects),使用变量语法后makefile就会变成下面的样子:

objects=main.o foo.o

hi: $(objects)
	cc -o hi $(objects)

main.o: main.c foo.h
	cc -c main.c
	
foo.o: foo.c foo.h
	cc -c foo.c

clean:
	rm hi $(objects)

makefile具有自动推导的能力,比如target如果是一个.o文件,那么makefile就会自动将.c加入prerequisites,而不用手动写,并且cc -c XXX.c 也会被推导出,利用了自动推导的makefile如下:

objects = main.o foo.o

hi: $(objects)
    cc -o hi $(objects)

main.o: foo.h
foo.o:

clean:
    rm hi $(objects)

待补充 make中通配符

cmake

由于GNU的make和其他工具,比如微软的nmake和BSD的pmake的makefile语法规则标准有所不同,因此如果想为多个平台和工具编写可编译的makefile需要写多份makefile文件。

为了应对这样重复繁琐的工作,cmake出现了。

我们可以编写CMakeList.txt这样的文件来定制编译流程,cmake会将其转换成平台和工具相应的makefile文件和对应的工程文件(比如Xcode工程和Visual Studio工程)。我们所熟悉的LLVM就是用的cmake,源码各个目录下都有对应的CMakeList.txt文件。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值