大型遗留C++代码库兼容旧编译器并适配C++20模块的实现及CMake配置问询
大型遗留C代码库兼容旧编译器并适配C20模块的实现及CMake配置问询
我手头有个规模不小的遗留C++代码库,一直采用传统的.hpp/.cpp头文件加实现文件的结构,为了兼容旧编译器,这套结构必须完整保留。
现有代码示例
// myLib.hpp int foo();
// myLib.cpp #include "myLib.hpp" int foo() { return 42; }
// main.cpp #include "myLib.hpp" int main() { return foo(); }
针对新版本的编译器,我希望能把特定头文件包装成C++20模块(比如命名为myModule),但这不能替代原有的头文件结构——有些依赖的编译单元可能还是得用#include "myLib.hpp",而另一些则可以直接使用import myModule;。
是否启用模块功能,我打算通过CMake选项来控制,这个选项会转换成预处理宏,示例配置如下:
# CMakeLists.txt option(CMAKE_USE_MODULES "Enable C++20 module usage" ON) if(CMAKE_USE_MODULES) add_compile_definitions(USE_MODULES) endif(CMAKE_USE_MODULES)
现在我有两个核心问题:
问题1:模块接口与实现的写法是否合理?
我自己尝试了一种实现方式,代码如下:
// myLib.hpp EXPORT int foo();
// myLib.cpp #define EXPORT #include "myLib.hpp" int foo() { return 42; }
// myModule.cpp export module myModule; #define EXPORT export #include "myLib.hpp"
// myModule_impl.cpp module myModule; #include "myLib.cpp"
其他编译单元可以根据情况选择使用头文件或模块,示例如下:
// tu_alwaysHeader.cpp #define EXPORT #include "myLib.hpp" int alwaysHeader() { return foo(); }
// tu_tryModuleOtherwiseHeader.cpp #ifdef USE_MODULES import myModule; #else #define EXPORT #include "myLib.hpp" #endif int tryModuleOtherwiseHeader() { return foo(); }
问题2:CMake中如何处理模块的依赖关系?
特别是myModule.cpp依赖myLib.hpp、myModule_impl.cpp依赖myLib.cpp的情况,该怎么在CMake里正确配置这些依赖?
备注:内容来源于stack exchange,提问作者jack




