我在同一个Visual Studio解决方案中有两个C++项目:Engine
,一个库;和Test
,它使用Engine
库Engine
在Windows上正确编译,并生成一个lib和一个dll。该库也正确地提供给Test
的链接器
在Test
中,我尝试从Engine
导入模块,但编译器失败,错误为C2230
以下是这两个项目的代码摘录: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; //fails here: error C2230 could not find module 'hal'
int main(int argc, char const* argv[])
{
prepareMain();
// some other stuff...
}
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
中导入模块时。
有人知道这件事吗?这是我不知道的正常行为吗?
1条答案
按热度按时间ccrfmcuu1#
可以使用带有C20模块的MSVC DLL。确保两件事:
1.导出的项目也是dll导出的,例如,
export __declspec(dllexport) int FunctionInDllExample(int x);
1.在项目属性中:VC Directories ->“所有模块都是公共的”设置为“是”。