一、Makefile
1.gcc编译
预处理--->编译---->汇编---->链接
预处理:展开头文件,替换宏,删除注释
gcc -E ***.c -o ***.i
编译:检查语法的正确性,生成汇编文件
gcc -S ***.i -o ***.s
汇编:把汇编文件转换为二进制文件
gcc -c ***.s -o ***.o
链接:把二进制文件链接为可执行文件
gcc ***.o -o 可执行文件
2.规则
目标:依赖
(tab)命令1
(tab)命令2
3.实例
3.1: .PHONT:为目标,防止当有一个名为clean的文件时,makefile不知道要执行哪个
#目标 :依赖
var = hello\hqyj
hello : hello.ogcc hello.o -o hello
hello.o : hello.cgcc -c hello.c -o hello.o.PHONY : clean #伪文件
clean:rm hello.orm hello
print:@echo ${var}
(加入@之后就不会打印执行的语句,直接打印输出的值)
3.2 父makefile读取到子中的makefile信息
父:
#目标 :依赖
include ./dir/makefile
var = hello\hqyj
hello : hello.ogcc hello.o -o hello
hello.o : hello.cgcc -c hello.c -o hello.o.PHONY : clean #伪文件
clean:rm hello.orm hello
print:echo ${subMakefile}
子:
subMakefile = ./dir/Makefile
3.3在makefile中加入头文件目录
#目标 :依赖
include ./dir/makefile
INCLUDE = -I./inc
var = hello\hqyj
hello : hello.ogcc hello.o -o hello
hello.o : hello.cgcc -c hello.c -o hello.o ${INCLUDE}.PHONY : clean #伪文件
clean:rm hello.orm hello
3.4存在多个相同目标时,以最后一个目标为准
print:@echo ${.INCLUDE_DIRS}@echo ${Hello}@echo ${HOME}
print:@echo "hello"
3.5 通配符
$@:所有目标
$^:所有依赖
$<:第一个依赖%.o:%.c 模式匹配,唯一的匹配关系,一般用在Makefile目标和依赖间的匹配关系
二、CMake
1.产生过程
项目代码--->CMakeLists.txt(脚本文件)--->cmake(执行命令)--->生成makefile--->make(执行命令)
2.实例
2.1.编译文件
mkdir build
在build 下敲cmake ..命令
再执行make就会生成可执行文件app
cmake_minimum_required(VERSION 3.0)#cmake的最低版本号
project(test)#定义工程名字
add_executable(app add.cpp div.cpp mult.cpp sub.cpp main.cpp)#定义工程生成一个可执行文件
2.2 set的使用
set(SRC *.cpp)这样的写法是错误的,需要通过file (GLOB SRC "*.cpp")查找当前路径下的所有app文件赋值给SRC
cmake_minimum_required(VERSION 3.0)#cmake的最低版本号
project(test)#定义工程名字
#set(SRC add.cpp div.cpp mult.cpp sub.cpp main.cpp)
file (GLOB SRC "/home/ubuntu/cmake/*.cpp")
set(EXECUTABLE_OUTPUT_PATH ./test)
set(CMAKE_CXX_STANDARD 11)#设置c++编译器的版本号
add_executable(app ${SRC})#定义工程生成一个可执行文件