概念
代码变成可执行文件,叫做编译(compile); 先编译这个,还是先编译那个(即编译的顺序安排),叫做构建(build)。 Make是最常用的构建工具。也就是将编译的顺序写在一个叫Makefile的文件中。Make命令依赖这个文件进行构建。 构建规则都写在Makefile文件里面,要学会如何Make命令,就必须学会如何编写Makefile文件。
常规gcc编译运行过程
gcc -c test.cpp test1.cpp test2.cpp 进行编译可以生成.o文件 test1.cpp test1.o test2.cpp test2.o test.cpp test.o
gcc -o app test1.o 链接生成可执行文件
然后运行该程序 ./app
makefile的出现(选择性编译)
https://www.cnblogs.com/lfri/p/9693545.html 我们编译链接三个文件成可执行文件,可以执行下面两步 gcc -c test.cpp test1.cpp test2.cpp gcc -o main test.o test1.o test2.o 这样的话我们也可以产生main程序,并不复杂。 但是如果我们考虑一下如果我们修改了其中的一个文件那么我们难道还要重新输入上面的命令? 也许你会说,这个很容易解决啊,我写一个 SHELL脚本,每次执行一下就可以了。对于这个简单程序来说,是没问题。但,如果我们的程序有几百个源程序的时候,那么我们编译器会一个一个源文件重新编译?每次这个编译时间就很长了。
而make正是帮我们解决这个问题的,当我们修改某个文件的时候他只会编译其中修改了的文件,而不会编译其他文件。大大缩短了编译时间。
makefile使用示例
下面我们编写一个最简单的Make file文件。 先编写好源文件(.c文件),然后在同一目录下新建名为Makefile(之前首字母必须大写,现在大小写都行)的文本文件。
hello: test.cpp
gcc -c test.cpp
gcc -o app test.o
然后执行make,编译完成后生成可执行文件,我们再运行程序 可以使用一些变量来精简语法
#定义变量并赋值
CC = gcc
CFLAGS = -lm -Wall -g
hello: test.cpp
$(CC) $(CFLAGS) test.cpp -o app #引用前面定义的变量,$(变量名),这种形式
makefile递归过程
CC = gcc
CFLAGS = -O -Wall -m64 -std=gnu89
LIBS = -lm
all: main_max #必须写成all这样的形式,否则只会生成前一个可执行文件main_max,
#前置条件是两个文件,他不执行语句
# 然后我们看前置条件main_max,他需要三个文件, .c在目录中存在,而其他两个前置条件我们继续向下搜索
# 所以说这个前置条件的查找类似于一个递归的过程
main_max: main_max.c bar.o foo.o # 前置条件是有main_max.c bar.o foo.o,如果前置条件存在,则可以执行下一行的命令
$(CC) main_max.c bar.o foo.o -o main_max
# 下面两个文件的两个前置条件是这两个.c文件存在,如果存在则编译生成.o文件
foo.o: foo.c
$(CC) -c foo.c
bar.o: bar.c
$(CC) -c bar.c
# 下面是防止重命名
.PHONY: clean
clean:
rm *.o main_max
执行make条件看到,我们这个是从下往上执行的gcc语句
makefile更多语法
更多语法可以参照阮老师教程 http://www.ruanyifeng.com/blog/2015/02/make.html
CmakeList.txt
简单的解释就是cmake是为了生成makefile而存在,这样我们就不需要再去写makefile了,只需要写简单的CMakeLists.txt即可。 https://blog.csdn.net/u013288190/article/details/113806637 添加一个CmakeList.txt文件
project(hello_jelly)
set(APP_SRC main_max.c)
add_executable(${PROJECT_NAME} main_max.c)
#print message
message(${PROJECT_SOURCE_DIR})
然后在该项目的目录下新建build文件夹 然后我门进入到build目录,执行命令cmake …/ 这样产生的所有临时文件都会生成在build目录下,而不影响源码目录的代码。 可以看到生成了很多文件,主要的是生成makefile文件 然后我们执行make就可以编译,并生成可执行文件了。 最后运行可执行文件
|