从外部共享库导入C++模块(错误C2230)

wd2eg0qa  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(255)

我在同一个Visual Studio解决方案中有两个C++项目:Engine,一个库;和Test,它使用Engine
Engine在Windows上正确编译,并生成一个lib和一个dll。该库也正确地提供给Test的链接器
Test中,我尝试从Engine导入模块,但编译器失败,错误为C2230
以下是这两个项目的代码摘录:
Engine > hal.ixx

  1. export module hal;
  2. #ifdef TEST_ENGINE_EXPORTS
  3. #define TEST_ENGINE_API __declspec(dllexport)
  4. #else
  5. #define TEST_ENGINE_API __declspec(dllimport)
  6. #endif
  7. import <string>;
  8. export extern TEST_ENGINE_API void prepareMain();
  9. export extern TEST_ENGINE_API int init();
  10. //...

Test > main.cpp

  1. #include <cstddef>
  2. #include <stdio.h>
  3. import hal; //fails here: error C2230 could not find module 'hal'
  4. int main(int argc, char const* argv[])
  5. {
  6. prepareMain();
  7. // some other stuff...
  8. }

Visual Studio 2022(v. 17.4.0),对于这两个项目,我使用std::c++latest、/permissive-和/experimental:module进行编译。我还添加了Engine头文件夹作为Test项目的Additional include目录。我已经尝试完全删除模块,并在Test中包含头文件,并且函数被正确调用
我已经读过这个问题(How to import a c++ module from another library?),它有同样的问题,和文章链接在一个评论(VS2019 Modules),但我没有看到它可以解决我的问题

编辑

所以,我运行了几个测试,基本上,这似乎源于我的库是一个dll项目
我尝试了一个新的解决方案与2个项目
库一是WindowsStaticLib项目。编译器选项包括:/std:c++latest/std:c17/permissive-/experimental:module、以及/sdl/W3(默认情况下最后2个,我让它们保持原样)。我停用了预编译头,因为它似乎会干扰模块(编译模块单元/exportHeader,因为当模块导入标准头导致VS开始在头中查找pch. h时,建议使用here
对于实际项目使用的库;库项目作为引用添加,编译器选项与库项目相同,lib头目录添加到VC++目录> External include目录,lib文件夹添加到库目录,并添加.lib文件作为附加依赖项
一切正常模块被正确地找到并导入,并且可以从实际项目调用函数。顺便说一下,我不需要将我的模块函数指定为extern,就可以在另一个项目main.cpp中使用。我以为我应该这么做,但显然不是。
现在我尝试做同样的事情,但与库的DLL项目。具有2个项目的新解决方案,其配置与以前的解决方案完全相同。错误C2230当我尝试在实际项目main.cpp中导入模块时。
有人知道这件事吗?这是我不知道的正常行为吗?

ccrfmcuu

ccrfmcuu1#

可以使用带有C20模块的MSVC DLL。确保两件事:
1.导出的项目也是dll导出的,例如,
export __declspec(dllexport) int FunctionInDllExample(int x);
1.在项目属性中:VC
Directories ->“所有模块都是公共的”设置为“是”。

相关问题