使用 gcc/g++ 将 link 模块拆分为多个文件的最佳实践

Best practice to link modules split into multiple files with gcc/g++

我想要一个只包含模块声明的文件和一个或多个包含定义的文件。

根据 12:04 上的 (and this awseome cppcon talk: https://youtu.be/nP8QcvPpGeM)我应该这样拆分我的文件:

Log.cpp:

export module Log;

int i = 0;
export void Log();

Log_imp.cpp:

module Log;

void Log() {
    std::cerr << "This is a log and i=" << i << "\n";
}

我可以用 g++-11 -std=c++20 -fmodules-ts -c Log.cppg++-11 -std=c++20 -fmodules-ts -c Log_imp.cpp分别

我的main只是导入了Log模块,调用了Log()函数。 请注意,我必须 link 同时使用 Log.o 和 Log_imp.o,否则我会收到 linking 错误。

是否可以在不构建静态库的情况下为单个模块创建单个目标文件?如果不是,那么我应该 link 将模块放入静态库,还是保留多个 .o 文件?

模块基本上与 linking 过程正交。每个模块文件都是自己的翻译单元,因此会生成自己的目标文件。您可以将它们组合成一个库(或 single object file),但除此之外,您将不得不 link 所有此类目标文件。