从外部共享库导入C++模块遇error C2230问题求助
在Visual Studio 2022(v17.4.0)的同一解决方案中,有两个C++项目:作为DLL库的Engine,以及调用该库的Test。Engine可正常编译生成lib和dll,Test已正确配置链接器指向该lib,但在Test的main.cpp中导入Engine的hal模块时,编译器报错C2230(无法找到模块'hal')。
Engine项目的hal.ixx代码:
export module hal; #ifdef TEST_ENGINE_EXPORTS #define TEST_ENGINE_API __declspec(dllexport) #else #define TEST_ENGINE_API __declspec(dllimport) #endif import <string>; export extern TEST_ENGINE_API void prepareMain(); export extern TEST_ENGINE_API int init(); //...
Test项目的main.cpp代码:
#include <cstddef> #include <stdio.h> import hal; // 此处报错:error C2230 could not find module 'hal' int main(int argc, char const* argv[]) { prepareMain(); // some other stuff... }
两个项目均启用/std:c++latest、/permissive-和/experimental:module编译选项,Test已添加Engine的头文件目录为附加包含目录。改用头文件包含方式时可正常调用函数;若Engine改为静态库项目,配置相同则可正常导入模块,但DLL模式下始终触发C2230错误。
请问这是正常行为吗?如何解决?
这不是正常行为,C++20模块在DLL中是支持的,问题出在DLL项目的模块输出配置和Test项目的模块搜索路径配置上,具体解决步骤如下:
配置Engine(DLL项目)的模块输出
右键Engine项目 → 属性 → 配置属性 → C/C++ → 输出文件,将模块输出文件设置为$(IntDir)\$(TargetName).ifc(或自定义路径),确保生成模块文件选项设为是(/experimental:module)。编译Engine后,会在指定目录生成hal.ifc等模块接口文件。配置Test项目的模块搜索路径
右键Test项目 → 属性 → 配置属性 → C/C++ → 常规,在附加模块依赖项中添加Engine项目的模块输出目录(例如$(SolutionDir)Engine\$(IntDir),根据实际路径调整)。注意:模块接口文件(.ifc)需要单独指定搜索路径,不是附加包含目录。优化DLL模块的导出方式(推荐)
C++模块中的导出无需结合__declspec(dllexport)/dllimport与extern,直接使用export关键字即可(模块会自动处理DLL导出逻辑)。修改hal.ixx代码:export module hal; import <string>; export void prepareMain(); export int init(); //...然后在Engine项目的实现文件(如
hal.cpp)中实现这些函数即可,无需额外标注导出。确保项目依赖顺序正确
在解决方案资源管理器中,右键Test项目 → 项目依赖 → 勾选Engine,保证Engine先于Test编译,确保模块接口文件已生成。
完成以上配置后,重新编译解决方案即可正常导入模块。
内容的提问来源于stack exchange,提问作者MetaZenithian

