Makefile 是一种常用于编译的脚本语言。它可以更好更方便的管理你的项目的代码编译,节约编译时间(没改动的文件不编译)。
注意 Makefile 文件命令必须是 Makefile 或者 makefile,并使用 make 命令编译。
目标…: 依赖…
(TAB) 命令1
(TAB) 命令2
意每条命令前必须有且仅有一个 tab 保持缩进,这是语法要求
目标就是可执行的文件,依赖就是多个源文件
重要的两个函数wildcard . patsubst INCS
SRC := ( w i l d c a r d . / ∗ . c ) m a i n : (wildcard ./*.c) main: (wildcard./∗.c)main:(SRC)
gcc $(SRC) -o main
一般用于很多的源文件,不可能一个个写,所以可以用wildcard来通配
INCS主要指定头文件在的目录,
INCS:= -i./xxx
一般用于多层目录的项目。
pat 是 pattern 的缩写,subst 是 substring 的缩写
OBJ = $(patsubst %.c, %.o, $(SRC))
取出 SRC 中所有的值,然后将 “.c” 替换为 “.o”,最后赋值给 OBJ 变量。
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c, %.o, $(SRC))
ALL: hello.out
hello.out: $(OBJ)
gcc $(OBJ) -o hello.out
$(OBJ): $(SRC)
gcc -c $(SRC) -o $(OBJ)
这样后面更改某个 “.c” 文件时,其它的 “.c” 文件将不再编译,而只是编译有更改的 “.c” 文件,可以大大节约大项目中的编译速度。
代码清理 clean
clean:
-rm -rf $(OBJ) hello.out
make clean一下就可以清理产生的文件
伪目标 .PHONY:clean是为了防止本身有一个clean文件,make只会显示`clean’ is up to date.
如果换了个平台makefile又要重新修改,这时候就出现了下面的Cmake这个工具.它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。
CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
项目信息
project (Demo2)
指定生成目标
add_executable(Demo main.cc MathFunctions.cc)
(但是如果源文件很多,把所有源文件的名字都加进去将是一件烦人的工作
aux_source_directory(. DIR_SRCS)
指定生成目标
add_executable(Demo ${DIR_SRCS})
多个目录,多个源文件
并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
添加 math 子目录
add_subdirectory(math)
指定生成目标
add_executable(Demo main.cc)
添加链接库
target_link_libraries(Demo MathFunctions)
该文件添加了下面的内容: 第3行,使用命令 add_subdirectory 指明本项目包含一个子目录 math,这样 math 目录下的 CMakeLists.txt 文件和源代码也会被处理 。第6行,使用命令 target_link_libraries 指明可执行文件 main 需要连接一个名为 MathFunctions 的链接库 。子目录中的 CMakeLists.txt:
查找当前目录下的所有源文件
并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
生成链接库
add_library (MathFunctions ${DIR_LIB_SRCS})
在该文件中使用命令 add_library 将 src 目录中的源文件编译为静态链接库。