本篇文章简要介绍如何在 Windows 上结合 CMake 使用 C++ 20 的新特性 modules。
为什么非要使用 CMake?对于中大型项目,使用构建工具能够方便我们管理构建项目所需要的依赖。CMake 是 C++ 构建工具中比较流行的一种。
1. 源代码
下面进入正题。项目的结构如下所示:
mymath.cppm
文件中的内容如下:
module; // 告知编译器这是一个module
export module mymath; // 对外导出模块mymath
export int add(int a, int b) {
return a + b;
}
export int multiply(int a, int b) {
return a * b;
}
main.cpp
文件中的内容:
// main.cpp
import mymath;
#include <iostream>
int main() {
int a = 5;
int b = 3;
std::cout << "Add: " << add(a, b) << std::endl;
std::cout << "Multiply: " << multiply(a, b) << std::endl;
return 0;
}
CMakeLists.txt
文件中的内容:
cmake_minimum_required(VERSION 3.28) # 从 cmake3.28 开始支持C++20
project(std_module_example CXX)
# set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "2182bf5c-ef0d-489a-91da-49dbc3090d2a")
# Default to C++ extensions being off. Clang's modules support have trouble
# with extensions right now and it is not required for any other compiler
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD 20)
add_library(mymath)
# target_sources()用来为目标(库或可执行文件)添加源文件。
target_sources(mymath
PUBLIC # 表示该模块可以被其它目标使用
FILE_SET cxx_modules TYPE CXX_MODULES FILES # 指定源文件的类型为C++模块
mymath.cppm
)
add_executable(hello main.cpp)
target_link_libraries(hello PRIVATE mymath)
2. 构建项目
在项目的当前目录下创建 build
目录,然后进入build
目录。
输入cmake ..
构建项目:
需要确保构建的编译器支持 C++ 20特性。
然后,编译项目,输入:cmake --build .
:
执行可执行文件:
遇到的问题:
- 编译器无法自动补全自己创建的 module。原因:可能是编译器的自动补全没有检测到自定义的模块。这个问题未能解决,不过并不影响编译。