目录
一、Makefile
1.1.简要介绍
“Makefile”是一个文本文件,用于定义和组织源代码的构建过程。它包含变量定义、规则和命令,描述了如何编译和链接源文件以生成可执行文件或其他目标。
通过运行“make”命令,系统按照“Makefile”中的规则自动执行构建任务,提高项目的可维护性和构建效率。
简单Makefile示例:
解释:运行"make"命令如自动执行第一个目标所对应的命令,若要选择其中一个目标的命令,需使用“make+目标名”。
1.2.Makefile三要素和工作原理
目标、依赖和命令为Makefile的三要素,见下面示例:
解释:运行“make”命令会执行第一个目标所对应的命令,但会检查有无依赖,有依赖的话会执行依赖所对应的命令。
解释:当你执行 make
命令时,Make 会依次检查 simple
目标的依赖项,并按顺序执行以下命令(如果需要):
-
如果
main.o
不存在或者main.c
被修改,执行:gcc -o main.o -c main.c
-
如果
foo.o
不存在或者foo.c
被修改,执行:gcc -o foo.o -c foo.c
-
最后执行:
gcc -o simple main.o foo.o
通过这些步骤,最终生成可执行文件 simple
。
.PHONY解释:
.PHONY
是一个特殊的 Makefile 目标,用于声明某些目标是“伪目标”(phony targets)。伪目标并不对应于实际存在的文件,它们仅仅是为执行一些命令或规则而定义的目标。在这个例子中,clean
是一个伪目标,它用于删除编译生成的中间文件和可执行文件。
.PHONY
是一种告诉 Make 目标不与实际文件关联的方式,使 Make 可以正确处理这些目标并避免文件冲突。它通常用于诸如 clean
、all
、install
等目标,这些目标通常不生成实际文件,而是执行一些操作。
工作原理图如下所示:
1
1.3. 变量
Ⅰ.普通变量使用见下面示例:
解释:如上面示例所示,CC、RM、EXE、OBJS都是变量,使用时需加上$(变量)。
Ⅱ.自动变量见下面示例:
输出:
$@
:当前目标名称。$^
:所有依赖文件的列表。$<
:第一个依赖文件。
Ⅲ.wildcard 函数和 patsubst 函数的使用见下面示例:
解释:
wildcard 函数是通配符函数,通过它可以得到我们所需的文件。形式:$(wildcard pattern)。
示例$(wildcard *.c) 会查找当前目录中所有以 .c 结尾的文件,并将这些文件名放入 SRCS 变量中。
patsubst 函数是用来进行字符串替换的,其形式是:$(patsubst pattern, replacement, text)。
示例$(patsubst %.c,%.o,$(SRCS)) 会将 SRCS 中所有 .c 文件名替换为相应的 .o 文件名。
二、CMake
2.1.简要介绍
CMake是一个跨平台的开源构建工具,用于管理软件项目的构建过程。它通过简化项目的配置和构建过程,使得在不同操作系统和编译器上更容易地生成可执行文件、库文件和其他项目文件。
CMake使用CMakeList.txt文件来描述项目的结构和构建规则。
2.2.CMake管理C++项目步骤
1.项目结构
把你的项目文件按下面结构放好:
MySimpleProject/
├── include/
│ └── MyFunctions.h
├── src/
│ ├── main.cpp
│ └── MyFunctions.cpp
└── CMakeLists.txt
include/MyFunctions.h
: 头文件,声明一些函数。src/MyFunctions.cpp
: 源文件,定义头文件中的函数。src/main.cpp
: 主程序,调用MyFunctions.cpp
中定义的函数。CMakeLists.txt
: CMake 配置文件
2. 编写 CMakeLists.txt
在项目根目录创建 CMakeLists.txt
文件,内容如下:
# CMake 最低版本要求
cmake_minimum_required(VERSION 3.10)
# 项目名称和版本号
project(MySimpleProject VERSION 1.0)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 包含头文件目录
include_directories(include)
# 指定源文件目录
set(SOURCES
src/main.cpp
src/MyFunctions.cpp
)
# 添加可执行文件
add_executable(MySimpleProject ${SOURCES})
# 链接库 (如果有依赖的库,比如 OpenCV)
# find_package(OpenCV REQUIRED)
# target_link_libraries(MyProject ${OpenCV_LIBS})
3. 构建项目
一旦你有了 CMakeLists.txt
文件,就可以通过以下步骤来构建你的项目:
Ⅰ.创建构建目录:
- 这种方法可以将构建文件和源代码分离,保持项目目录的整洁。
mkdir build
cd build
Ⅱ.运行 CMake 生成构建文件:
- 这一步将生成平台相关的构建文件。例如,在 Unix-like 系统上生成
Makefile
。
cmake ..
Ⅲ.构建项目:
- 如果你在 Unix-like 系统上,可以使用
make
命令构建项目。
make
Ⅳ.运行生成的可执行文件:
- 可执行文件通常在
build/
目录下生成。./MySimpleProject
4. 添加更多的源文件或库
如果你的项目包含多个源文件或使用第三方库,只需在 CMakeLists.txt
中添加相应的配置。例如:
set(SOURCES
src/main.cpp
src/other.cpp
)
# 如果使用外部库(如 OpenCV)
find_package(OpenCV REQUIRED)
target_link_libraries(MyProject ${OpenCV_LIBS})
5.运行和清理
- 运行可执行文件:在
build/
目录中找到生成的可执行文件并运行。 - 清理构建文件:要清理构建目录,可以运行
make clean
或者直接删除build
目录。
make clean
rm -rf build
总结:
CMake 是一个功能强大的工具,能够帮助你高效地管理 C++ 项目。通过编写 CMakeLists.txt
文件,你可以轻松地配置和构建跨平台的 C++ 项目,并集成各种外部库和依赖。随着项目的复杂度增加,CMake 提供了更多的灵活性,可以管理子项目、库等。