本篇文章简要介绍如何在 Windows 上结合 CMake 使用 C++ 20 的新特性 modules。
为什么非要使用 CMake?对于中大型项目,使用构建工具能够方便我们管理构建项目所需要的依赖。CMake 是 C++ 构建工具中比较流行的一种。
文章目录
- 1. 源代码
- 2. 构建项目
1. 源代码
下面进入正题。项目的结构如下所示:
mymath.cppm
文件中的内容如下:
module; // 告知编译器这是一个moduleexport module mymath; // 对外导出模块mymathexport 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(mymathPUBLIC # 表示该模块可以被其它目标使用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。原因:可能是编译器的自动补全没有检测到自定义的模块。这个问题未能解决,不过并不影响编译。