🌈 C++20特性Modules(一) : 裸编Modules
☀️ 准备工作
首先准备两个文件: import.cpp和mathlib.cpp
// import.cpp源代码
import <iostream>;
import mathlib;
using namespace std;
int main() {
cout << "Modules, baby!" << endl;
cout << "2 plus 3 makes " << add(2, 3) << " says module 'mathlib'" << endl;
return 0;
}
// mathlib.cpp源代码
export module mathlib;
export int add(int a, int b) {
return a + b;
}
两个文件准备好了之后,就需要进行编译:
🍄编译步骤
💥编译mathlib.cpp
首先,编译 mathlib.cpp 以生成模块实现的目标文件。确保使用 -std=c++20 和 -fmodules-ts 标志来启用模块支持。
g++ -std=c++20 -fmodules-ts -c mathlib.cpp -o mathlib.o
解释
✅
-std=c++20:启用 C++20 标准。✅
-fmodules-ts:启用模块支持(Technical Specification)。✅
-c:仅编译,不进行链接。✅
-o mathlib.o:指定输出目标文件为mathlib.o。
💥编译import.cpp
编译 import.cpp,并将之前生成的 mathlib.o 目标文件与之链接,生成最终的可执行文件
g++ -std=c++20 -fmodules-ts import.cpp mathlib.o -o demo
解释
✅同样使用了
-std=c++20和-fmodules-ts标志。✅
import.cpp是主程序源文件。✅
mathlib.o是之前编译的模块目标文件。✅
-o demo指定输出的可执行文件名为demo。
运行上述命令,这个时候会报错:
In module imported at import.cpp:1:1:
/home/opt/compiler/gcc-12/include/c++/12.1.0/iostream: error: failed to read compiled module: No such file or directory
/home/opt/compiler/gcc-12/include/c++/12.1.0/iostream: note: compiled module file is ‘gcm.cache/./home/opt/compiler/gcc-12/include/c++/12.1.0/iostream.gcm’
/home/opt/compiler/gcc-12/include/c++/12.1.0/iostream: note: imports must be built before being imported
/home/opt/compiler/gcc-12/include/c++/12.1.0/iostream: fatal error: returning to the gate for a mechanical issue
compilation terminated.
原因分析
这个错误主要是因为 G++ 12.1.0 对 C++20 模块的支持尚不完善,特别是标准库(如
<iostream>)的模块化支持。具体原因如下:
- 标准库模块化支持不完整:GCC 12.1.0 并未预先编译标准库的模块文件(如
iostream.gcm),因此在import <iostream>;时,编译器找不到相应的已编译模块文件。- GCC 的模块支持处于实验阶段:虽然 GCC 从版本 10 开始引入了对 C++20 模块的支持,但在 12.1.0 版本中,这一支持仍然不够成熟,存在诸多限制和已知问题。
解决方案是修改import.cpp, 标准库还是采用传统的include方式引入,之后再运行第二步命令行就可以生成demo可执行文件。
// import.cpp源代码
#include <iostream> // 使用 #include 代替 import
import mathlib;
using namespace std;
int main() {
cout << "Modules, baby!" << endl;
cout << "2 plus 3 makes " << add(2, 3) << " says module 'mathlib'" << endl;
return 0;
}
💥 运行生成的可执行文件
编译成功后,运行程序以验证输出:
$ ./demo
Modules, baby!
2 plus 3 makes 5 says module 'mathlib'
📱 联系方式
| 更多文章或咨询关注:微信公众号(pwfocus) | 项目合作加个人微信 |
|---|---|
![]() |
![]() |

