【问题标题】:Unable to Import C++ Modules无法导入 C++ 模块
【发布时间】:2021-07-27 07:02:56
【问题描述】:

我正在尝试使用模块在 C++ 20 中重建我的一个项目,以减少依赖关系和编译时间。我尝试导入一些模块,并且我能够这样做,但 Visual Studio 将导入语句标记为未定义:"Could not find module file for..."。尽管将其标记为错误,但我仍然能够编译和运行导入的函数(尽管如果它需要单独的 #include 仅在模块中而不是 .cpp 文件中找到,则它不允许我编译函数它导入到,给我一个链接器错误)。我密切关注 Microsoft 的文档,并且能够在早期项目中使用模块,并且从未遇到任何这些问题,我确保在该项目中重新建立相同的配置,但这种情况发生了。

我不确定我还能提供哪些其他信息,但请询问是否有必要。任何帮助将不胜感激

配置:

作品

import Object;

#include <iostream>

int main() {
    calc(1, 5);
}
export module Object;

export int calc(int a, int b) {
    return a + b;
}

不起作用

import Object;

#include <iostream>

int main() {
    calc(1, 5);
}
export module Object;

#include <iostream>

export int calc(int a, int b) {
    return a + b;
}

如您所见,有多个链接错误:

无论哪种方式,VS都将其标记为错误

编辑 通过将 #include 放在模块导出语句上方,代码编译,但 VS 仍将其标记为错误。尽管导入诸如&lt;iostream&gt; 之类的标头或导出类都不起作用。所以我可以编译,但只能编译某些东西,VS总是将其标记为错误

【问题讨论】:

  • 您应该提供minimal reproducible example。在这种情况下,您正在使用的文件和构建设置。
  • 我确保启用实验模块功能并选择最新的 C++ 标准。问题是,我今天早些时候在一个项目中使用了完全相同的构建设置来测试模块并且它有效,但我似乎无法复制它
  • 如果您无法复制该问题,这意味着我们也无法复制,如果您不显示您正在使用的设置,则绝对不会。
  • 好的,这里是语言配置页面
  • @ItsMe 我编辑了问题以包含代码。您无法在谷歌上搜索图像,并且在可能有文字的情况下阅读图像并不有趣。如果您还可以将链接错误的编译器输出而不是最后一个图像,那就太好了。

标签: c++ import module c++20


【解决方案1】:

您不能在模块中包含这样的内容。将头文件包含到模块中将使 所有 其内容 成为模块的一部分。由于您没有为从包含中声明的标准库函数定义实现,因此会导致链接错误。

标题有两种选择。

首先是使用全局模块片段:

module;
#include <iostream>
export module Object;

// ...

第二种选择是使用标题单元:

export module Object;

import <iostream>

【讨论】:

  • 谢谢!我想知道“Visual Studio 构建系统的名称和结构受到限制”具体指的是什么。在什么情况下我可以使用模块?另外一点 - 我尝试导入而不是按照您的建议包含标题,但我无法这样做
  • @ItsMe 嗯,阅读文档似乎他们删除了构建系统中的限制,所以理论上你应该能够导入任何模块,只要你在项目中定义它们。不过我不知道外部依赖项。
  • @ItsMe 阅读文档import &lt;header&gt; 应该可以正常工作,所以我不确定这里出了什么问题。我还没有尝试过模块。
  • 它在早期的项目中工作得很好……但现在肯定不行。不管怎样都谢谢你
  • 当我尝试导入时,例如,std.core,它给了我这个错误:C1011: cannot locate... Did you install the library part of the C++ modules feature in VS setup?。网上好像其他人也遇到过这个问题
猜你喜欢
  • 2015-05-08
  • 1970-01-01
  • 2012-11-06
  • 2017-11-11
  • 2019-06-13
  • 2020-12-15
  • 2020-08-28
  • 2015-10-04
相关资源
最近更新 更多