使用 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.cpp
和
g++-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 所有此类目标文件。
我想要一个只包含模块声明的文件和一个或多个包含定义的文件。
根据 12:04 上的
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.cpp
和
g++-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 所有此类目标文件。