CMake 学习笔记
CMake 是什么
CMake 是一个跨平台的自动化构建系统,使用 CMake 可以简化 C++ 项目的构建,CMake 脚本可以生成 Makefile、Visual Studio 项目和 Xcode 项目等构建文件。
CMake 的优势
CMake 有以下优点:
- 跨平台:CMake 可以在多个操作系统和编译器下运行。
- 系统独立性:CMake 可以生成不同构建系统所需的文件,比如 Makefile、MSVC 等。
- 模块化:CMake 的模块化设计可以管理复杂的构建过程。
- 配置灵活:可以通过设置不同的变量来定制项目的构建选项。
CMake 的基本用法
CMake 使用 CMakeLists.txt 文件来描述项目的组织结构和各个组件之间的依赖关系。通常情况下,CMakeLists.txt 文件应该放在源代码根目录下。
下面是一个简单的 CMakeLists.txt 文件示例:
cmake_minimum_required(VERSION 3.0)
# 设置项目名称
project(hello)
# 添加可执行文件
add_executable(hello main.cpp)
CMakeLists.txt 文件语法说明
cmake_minimum_required
指定该 CMake 脚本所需的 CMake 最小版本。
project
指定项目名称和项目语言。可以通过后面的参数指定项目语言,比如:
project(hello CXX)
表示该项目使用 C++ 语言。
add_executable
指定可执行文件的名称和源文件列表。例如:
add_executable(hello main.cpp foo.cpp bar.cpp)
表示将 main.cpp
、foo.cpp
、bar.cpp
编译成名为 hello
的可执行文件。
add_library
指定库文件的名称和源文件列表。例如:
add_library(foo foo.cpp)
表示将 foo.cpp
编译成名为 libfoo.a
的静态库。
target_link_libraries
指定可执行文件或库文件所依赖的库。例如:
target_link_libraries(hello foo)
表示 hello
可执行文件需要链接到 libfoo.a
静态库。
CMake 的高级用法
多目录项目构建
对于大型项目,通常会涉及到多个目录,每个目录都有其自己的 CMakeLists.txt 文件。可以通过 add_subdirectory 命令添加子目录,这样子目录的 CMakeFile.txt 文件就会被包含在主 CMakeLists.txt 文件中,从而实现多个目录的项目构建。
add_subdirectory(foo)
add_subdirectory(bar)
外部依赖包的使用
在项目的 CMakeLists.txt 文件中可以使用 find_package 命令查找外部依赖包。例如,如果我们需要使用 Boost 库,可以写如下的代码:
find_package(Boost REQUIRED COMPONENTS system thread)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(hello ${Boost_LIBRARIES})
构建类型
在 CMake 中,可以通过设置 CMAKE_BUILD_TYPE 变量来指定构建类型。常用的构建类型包括:
- Debug:调试版本。
- Release:发布版本。
- RelWithDebInfo:包含发布版本和调试信息的版本。
- MinSizeRel:包含发布版本,并优化代码大小的版本。
例如,我们可以在命令行中这样设置:
cmake -DCMAKE_BUILD_TYPE=Release ..
即可指定为 Release 构建类型进行构建。
示例:构建一个 C++ 程序
下面是一个简单的 C++ 程序,我们使用 CMake 来构建该程序。
项目组织结构
假设该项目的组织结构如下:
.
├── CMakeLists.txt
├── include
│ └── hello.h
├── src
│ ├── hello.cpp
│ └── main.cpp
└── README.md
其中,包含了一个头文件 hello.h
,两个源文件 hello.cpp
和 main.cpp
。
编写 CMakeLists.txt
针对该项目的组织结构,我们可以编写如下的 CMakeLists.txt 文件:
cmake_minimum_required(VERSION 3.0)
# 设置项目名称
project(hello)
# 指定 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 添加头文件
include_directories(include)
# 添加可执行文件
add_executable(hello src/main.cpp src/hello.cpp)
在该文件中,我们指定了项目名称为 hello
,并指定了 C++ 标准为 C++11。然后,通过 include_directories 命令添加了头文件所在的目录,在该项目中,头文件都在 include
目录中。最后,通过 add_executable 命令添加了 main.cpp
和 hello.cpp
,并构建为名为 hello
的可执行文件。
编译和运行
在项目的根目录下,执行以下命令:
mkdir build && cd build
cmake ..
make
执行以上命令即可编译出名为 hello
的可执行文件。可以通过以下命令运行该可执行文件:
./hello
示例:构建一个外部依赖工程
下面以 JSON 静态库为例,说明如何使用 CMake 构建一个外部依赖工程。
下载 JSON 库
JSON 库是一个轻量级的 C++ JSON 解析器 and generator,可以从官方网站下载:https://github.com/nlohmann/json/archive/v3.9.1.tar.gz
下载后解压到一个合适的位置。
添加 CMakeLists.txt
假设解压后的 JSON 库源代码放在 ~/json-3.9.1
目录下,我们在该目录下添加一个 CMakeLists.txt 文件:
cmake_minimum_required(VERSION 3.0)
# 设置项目名称
project(json)
# 添加编译选项
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 设置头文件目录
include_directories(include)
# 添加源文件
set(SOURCES json.hpp)
# 生成库文件
add_library(json STATIC ${SOURCES})
在该文件中,我们指定了项目名称为 json
,并指定了 C++ 标准为 C++11,如上面所示。然后,通过 include_directories 命令添加了 JSON 库的头文件所在的目录,在 JSON 库中,头文件都在 include
目录中。最后,通过 add_library 命令添加了 json.hpp
头文件,并构建为名为 json
的静态库。
编译和使用 JSON 库
在 JSON 库源代码目录下创建一个 build
目录,并进入该目录,执行以下命令:
cmake ../
make
执行以上命令,即可编译出名为 libjson.a
的静态库文件。
在你需要使用该库的项目 CMakeLists.txt 文件中,添加以下代码:
# 查找 JSON 库
find_library(JSON_LIB NAMES json PATHS ~/json-3.9.1/build)
# 添加链接库
target_link_libraries(your_target_name ${JSON_LIB})
其中,your_target_name
为你的目标名称。这样就可以在你的项目中使用 JSON 库了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:cmake 学习笔记 - Python技术站