You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

大型遗留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.hppmyModule_impl.cpp依赖myLib.cpp的情况,该怎么在CMake里正确配置这些依赖?

备注:内容来源于stack exchange,提问作者jack

火山引擎 最新活动