CMake 是一个跨平台的构建系统生成工具,可以根据项目的配置生成特定平台的构建文件。要在一个项目中使用 CMake 生成 Makefile,按照以下步骤进行:
项目目录结构
假设你有以下项目目录结构:
MyProject
├── CMakeLists.txt
├── main.cpp
├── foo.cpp
└── bar.cpp
CMakeLists.txt 文件
首先在项目根目录(MyProject
)中创建一个 CMakeLists.txt
文件。这个文件定义了项目相关的配置信息,比如项目名称、需要的 C++ 标准、源文件等。
CMakeLists.txt 内容示例:
# 指定所需的最低 CMake 版本
cmake_minimum_required(VERSION 3.10)
# 定义项目名称和语言
project(MyProject LANGUAGES CXX)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 添加可执行文件及其源文件
add_executable(MyProgram main.cpp foo.cpp bar.cpp)
生成 Makefile
在生成 Makefile 之前,需要新建一个构建目录。在这个目录中执行 cmake
命令,这样可以保持源码目录的整洁。构建目录可以随意命名,不过一般叫做 build
。
步骤如下:
1. 创建构建目录并进入构建目录:
mkdir build
cd build
2. 运行 CMake 命令生成 Makefile:
cmake ..
这里的 ..
表示 CMakeLists.txt 文件所在的上级目录。运行这个命令后,CMake 会根据 CMakeLists.txt
的配置生成 Makefile 和其他所需的构建文件。
3. 查看生成的构建文件:
运行完 cmake ..
命令后,在 build
目录中会看到生成的 Makefile 和其他一些文件和目录。这些文件和生成规则会根据你的 CMakeLists.txt
文件配置来生成。
编译项目
当 Makefile 生成完成后,可以直接使用 make
命令编译项目:
make
这个命令会根据 Makefile 中的规则编译你的项目,生成可执行文件。例如,在上面的例子中,会生成名为 MyProgram
的可执行文件。
清理构建文件
如果需要清理生成的构建文件,可以直接在构建目录中执行 make clean
:
make clean
当然,手动删除 build
目录也是可以的:
cd ..
rm -rf build
更多配置选项
CMake 提供了丰富的配置选项,可以通过修改 CMakeLists.txt
文件进一步定制,比如配置库文件、头文件搜索路径、编译选项等。
包含目录
如果项目有头文件,需要指定头文件目录,可以使用 include_directories
命令:
include_directories(${PROJECT_SOURCE_DIR}/include)
链接库
如果需要链接外部库,可以使用 target_link_libraries
命令:
target_link_libraries(MyProgram PRIVATE MyLib)
示例:更多高级用法
使用外部库
假设你的项目需要使用 Boost 库,可以使用 find_package
命令:
CMakeLists.txt 内容示例:
cmake_minimum_required(VERSION 3.10)
project(MyProject LANGUAGES CXX)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 查找 Boost 库
find_package(Boost 1.70 REQUIRED COMPONENTS filesystem system)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(MyProgram main.cpp foo.cpp bar.cpp)
target_link_libraries(MyProgram ${Boost_LIBRARIES})
endif()
自定义构建类型
可以定义不同的构建类型,如 Debug、Release:
# 设置默认生成类型为 Release
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
# 定义构建类型及其编译选项
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -O0 -g")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -O3")
运行 CMake 时可以指定构建类型:
cmake -DCMAKE_BUILD_TYPE=Debug ..
总结
通过上述步骤,CMake 可以生成 Makefile,从而在 Unix/Linux 环境下使用 make
进行编译。CMake 提供了更高层次的抽象和灵活性,可以生成不同平台的构建文件,不仅限于 Makefile,这使得它成为跨平台项目构建的强大工具。
这些步骤和配置都可以根据项目的实际需求进行调整,以满足特定的构建需求。学习和掌握 CMake 的各种命令和选项,可以极大地提高项目构建和管理的效率。