CMake 项目简介
CMake 是一个跨平台的构建工具,用于管理 C/C++ 项目的编译过程。它通过生成标准的构建文件(如 Makefile、Visual Studio 项目文件、Ninja 构建文件等)来简化项目的构建流程。CMake 的核心是 CMakeLists.txt
文件,它定义了项目的构建规则、依赖关系和编译选项。
CMake 项目的基本结构
一个典型的 CMake 项目通常包含以下文件和目录:
MyProject/
├── CMakeLists.txt # 项目的根 CMake 配置文件
├── include/ # 头文件目录
│ └── mylib.h # 头文件
├── src/ # 源文件目录
│ ├── main.cpp # 主程序源文件
│ └── mylib.cpp # 库源文件
├── tests/ # 测试代码目录
│ └── test.cpp # 测试代码
└── build/ # 构建目录(由用户创建,用于存放构建文件)
CMakeLists.txt
# 指定 CMake 的最低版本
cmake_minimum_required(VERSION 3.10)# 定义项目名称和版本
project(MyProject VERSION 1.0)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 设置编译选项
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -O2")# 添加头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)# 添加可执行文件
add_executable(myprogram src/main.cpp src/mylib.cpp)# 添加静态库
add_library(mylib STATIC src/mylib.cpp)# 链接库
target_link_libraries(myprogram mylib)# 查找并链接外部库
find_package(OpenCV REQUIRED)
target_link_libraries(myprogram ${OpenCV_LIBS})# 添加子目录
add_subdirectory(tests)# 安装规则
install(TARGETS myprogram DESTINATION bin)
install(TARGETS mylib DESTINATION lib)
install(DIRECTORY include/ DESTINATION include)# 启用测试
enable_testing()# 添加测试
add_test(NAME mytest COMMAND myprogram)
src/main.cpp
#include <iostream>
#include "mylib.h"int main() {std::cout << "Hello, World!" << std::endl;mylib::printMessage("This is a message from mylib.");return 0;
}
src/mylib.cpp
#include "mylib.h"
#include <iostream>void mylib::printMessage(const std::string& message) {std::cout << message << std::endl;
}
include/mylib.h
#ifndef MYLIB_H
#define MYLIB_H#include <string>namespace mylib {void printMessage(const std::string& message);
}#endif // MYLIB_H
tests/test.cpp
#include <iostream>
#include "mylib.h"int main() {mylib::printMessage("This is a test message.");return 0;
}
构建和运行项目
-
创建构建目录:
mkdir build cd build
-
生成构建文件:
cmake …
3. **编译项目**:```bash
make
-
运行可执行文件:
./myprogram
5. **运行测试**:```bash
make test
总结
CMake 项目通过 CMakeLists.txt
文件定义构建规则,支持跨平台构建。一个典型的 CMake 项目包括:
- 基本配置(项目名称、版本、编译选项)。
- 目标定义(可执行文件、库)。
- 依赖管理(头文件、外部库)。
- 安装规则和测试。
通过合理组织 CMake 项目,可以轻松管理复杂的构建过程,并实现跨平台支持。