问题标签 [c++-modules]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2519 浏览

c++ - 使用 CMake 的实验性模块依赖扫描构建 C++ 模块

CMake 具有实验性 C++20 模块依赖扫描 ( !5562 )。我尝试使用 CMake 3.20、g++-11 和 ninja-1.10 来构建带有模块的项目。

CMakeLists.txt 改编自https://gitlab.kitware.com/ben.boeckel/cmake/blob/cpp-modules/Modules/Compiler/GNU-CXX.cmake

但是 CMake 和 ninja 不构建项目:

此处评分最高的答案(来自 ComicSansMS)说我们可以使用实验功能来构建 C++20 模块: 如何使用 CMake 使用 c++20 模块?

CMake可以自动扫描模块依赖并构建项目吗?

0 投票
0 回答
58 浏览

c++ - 导入多个模块会导致构建失败 - C2664

我正在尝试使用 C++20 模块,但遇到了一个我不知道如何修复的错误。

请参阅以下模块文件(VClipTypes.ixx):

和 main.cpp:

在这种形式下,代码编译并正常运行,输出为“1”,正如预期的那样。

但是,如果我将 Vec3 类移动到它自己的模块接口(Vector.ixx)

import Vector;然后在 VClipTypes.ixx 和 main.cpp 中添加一个语句,然后构建失败并出现以下错误:

在我看来,矢量模板实例化已经发生了一些事情,但我不能确定。我确定我在某个地方做错了什么,但我看不出在哪里。

你能指出我的错误吗?

0 投票
1 回答
160 浏览

c++ - C++ 模块分区包含语句

我有以下两个文件:

使用 GCC11,我做

此代码无法编译(内部编译器错误)。但是,如果我将 iomanip 包含在 apartment.cpp 和 building.cpp 中,我不会收到任何错误。我记得 MSVC 编译器也有类似的情况。我究竟做错了什么?模块文件及其分区中是否应该包含相同的包含语句?

0 投票
3 回答
491 浏览

c++ - C++ 模块从另一个模块转发声明实体

我最近一直在尝试使用 GCC 11 将代码库转换为 C++20 模块。但是,我陷入了以下情况。首先,这是使用标题的方法:

A.cpp

(这里Bh的内容不重要)

需要注意的是 B 的前向声明。不是每个使用 A 的人都应该关心 B,所以我使用前向声明来阻止重新编译的发生。使用标头,这种情况非常有效。

问题在于尝试将此代码转换为模块时。主要问题是实体与声明它们的模块相关联,因此在 Ah 中进行前向声明是不可能的。我尝试在全局模块中进行前向声明,但编译器仍然抱怨 B 的定义与其声明位于不同的模块中。我还尝试了第三个模块,它只包含 B 的前向声明,但这仍然是在两个不同的模块中声明和定义 B。所以,我的主要问题是:我怎样才能从模块之外的模块中转发声明一些东西? 我也会对最终产生相同效果的方式感到满意:当 B 更改时,A 的用户不需要重新编译。

在搜索时,我发现一些地方在谈论类似的情况,但由于某种原因它们都不起作用。他们没有工作的原因:

  • 有人说有一个带有前向声明的模块。正如我上面所说,这不起作用。
  • 有人说要使用宣布的所有权声明。但是,它们已从最终的 C++ 标准中删除。
  • 有人说使用模块分区。但是,这仅在 A 和 B 在同一模块中时才有效。A 和 B 不应该在同一个模块中,所以这不起作用。

编辑:作为对评论的回应,以下是我尝试过的一些事情的详细信息:

尝试 1:在 A.mpp 中转发声明 B

A.mpp

B.mpp

A.cpp

执行此操作时,gcc 错误

尝试 2:在新模块中前向声明

B_decl.mpp

A.mpp

B.mpp

A.mpp

执行此操作时,gcc 错误

尝试 3:在标头中前向声明,在模块中定义

B_decl.h

A.mpp

B.mpp

A.cpp

执行此操作时,gcc 错误

0 投票
0 回答
378 浏览

c++ - 为什么 GCC-11 在包含这组特定的标准库时会出现段错误?

双重编辑:仅在使用 libstdc++ 时,由于可能的错误和 Clang 段错误而导致 GCC 段错误。起初我不知道这是因为编译器段错误不是特别有用,但是使用标志 -stdlib=libc++,你可以让 clang 编译这段代码就好了。使用 libstdc++ 时的 Clang 段错误是一个单独的问题,这个问题特别关注 GCC。

可以在其相关的错误报告 #101184 中找到进一步简化的 GCC 示例。如果您对解决方案感兴趣,我建议您跟上错误报告。


在下面的代码墙中,有一些小的 c++20 模块在使用包含的命令构建时会导致GCC-11编译器段错误。

我试图在下面的文字中解释这个问题,但这个问题有点挑剔,我发现理解它的最好方法是稍微尝试一下。

其中两个模块,“filler1”和“filler2”不导出任何东西,只在导出模块指令之前包含几个标准库。因为这两个实际上没有导出任何内容,所以我希望它不会对程序行为产生任何影响,但由于某种原因,如果两者都包括在内,则 GCC 段错误。如果以任何顺序删除其中任何一个,程序都可以正常编译。此外,这些填充模块中包含的标准库是特殊的,如果删除了“功能”或“内存”,即使它们没有在整个程序的任何地方使用,它也可以正常编译。

还有 testmod1 模块,它只包含“向量”。但与填充模块不同的是,要发生段错误,必须在 export 模块指令之后定义一个可能导出也可能不导出的任意类型的向量。

最后一个也可能是最奇怪的部分是 testmodp 模块。除了存在所有前面的微粒之外,还必须定义一个模板结构:template<typename...Ts>和一个成员向量:std::vectorstd::variant<Ts...>,然后由 test_impl 模块实例化. 如果我从结构中删除模板并将成员更改为:“ std::vector<std::variant<int, float>> ”即使它与模板类型实例化的类型相同,它也可以正常工作反而。谁能帮我理解这里发生了什么?

注意:因为这个错误非常特殊,所以我可以在不改变行为的情况下将它提取到最小的 5 个文件示例,我也不允许包含链接,所以如果你想测试它,请复制所有带有对应名称的内容。如果这里有问题,请随时在评论中联系(:

谢谢阅读!

文件“filler1.cc”

文件“filler2.cc”

文件“testmodp.cc”

文件“testmod1.cc”

文件“test_impl.cc”

GCC命令运行

GCC内部编译器错误:

0 投票
0 回答
110 浏览

c++ - 尝试模块化一些标准头文件c ++时出现编译错误

我正在尝试将一些头文件编译成一个模块,这样我就可以使用这个编译器选项测试它是否有效:

其中<file-name>是标题的名称,例如string_view.

但是,并非所有头文件都能和谐地工作,这是无法编译的头文件列表,其中包含常见错误,例如 , 的导入宏定义不一致NULL__stdcall指向类的递归延迟加载allocator,以及在范围内找不到的 I/O 函数,例如vsnprintf. 一些错误通常指向<pthread.h><process.h>c-headers。

  • <bitset>
  • <memory_resource>
  • <stdexcept>
  • <system_error>
  • <string>
  • <iterator>
  • <ranges>
  • <algorithm>
  • <execution>
  • <complex>
  • <random>
  • <locale>
  • <ios>
  • <istream>
  • <ostream>
  • <iostream>
  • <fstream>
  • <sstream>
  • <syncstream>
  • <iomanip>
  • <streambuf>
  • <filesystem>
  • <regex>
  • <thread>
  • <stop_token>
  • <mutex>
  • <shared_mutex>
  • <future>
  • <condition_variable>
  • <span>

上面没有提到的headers编译成功。

注意:我使用的是 GCC 11.1 版。


更新

有些头文件是我自己解决的,唯一不能编译的头文件是:

  • <execution>
  • <locale>
  • <iomanip>
  • <filesystem>
  • <thread>
  • <stop_token>
  • <condition_variable>

正如我在第一个上面提到的,他们共享的唯一常见错误是不一致的导入宏定义NULL

0 投票
0 回答
65 浏览

c++ - 如何使用 C++20 模块包装实现?

我在包装可比距离的增强几何实现时遇到了麻烦。我不确定是因为我使用的模块不正确,还是因为 boost 几何本身有问题。在模块文件中,我有:

在调用程序中我有:

当我编译时,我得到一个冗长的错误(我觉得这没有帮助,但也许它对你有帮助)

0 投票
1 回答
45 浏览

c++ - 我们是否应该在全局模块片段中为废弃变量的初始化声明所使用的废弃函数提供定义?

当我在一个模块单元的全局模块片段中#include一个头文件时,我遇到了MSVC和GCC一起提供的一些链接错误。

首先,我有一个像这样的头文件“Header.h”

然后,我定义了一个主模块接口单元[m1.ixx OR m1.cpp],如下所示:

最后,我将模块导入“main.cpp”并构建示例,“main.cpp”如下所示:

我从 GCC11 收到了一些链接错误:

/usr/bin/ld: /tmp/ccEkMykg.o: 在函数`__static_initialization_and_destruction_0(int, int)'中:

m1.cpp:(.text+0x1e): 对“f()”的未定义引用

同样来自 MSVC 的链接错误:

严重性代码 描述 项目文件行抑制状态错误 LNK1120 1 unresolved externals Study2 C:\Users\Glx\source\repos\Study2\x64\Debug\Study2.exe 1

严重性代码描述项目文件行抑制状态错误 LNK2019 未解析的外部符号“int __cdecl f(void)”(?f@@YAHXZ) 在函数“void __cdecl `dynamic initializer for 'value''(void)”(??__Evalue) 中引用@@YAXXZ) Study2 C:\Users\Glx\source\repos\Study2\Study2\m1.ixx.obj 1

在我的理解中,变量和函数f()的声明应该被丢弃,因为它们是全局模块片段中的声明, 并没有被模块单元使用,所以即使我不提供定义也没关系对于函数 f()

我理解错了吗?

0 投票
0 回答
52 浏览

cmake - 带有 cmake + ninja 的 C++20 模块

我在哪里可以找到如何使用 cmake + ninja 构建 C++20 模块的示例?

你好.mpp

主.cpp:

我应该在 CMakeLists.txt 中写什么来构建它?我需要一个跨平台的解决方案

0 投票
1 回答
253 浏览

c++ - 使用 c++20 模块的“循环依赖”错误

我试图在另一个模块中包含一个模块,但由于以下错误我无法编译:

“无法构建以下源文件,因为它们之间存在循环依赖关系:Module1.ixx 依赖于 Module2.ixx 依赖于 Module1.ixx。”

我试过的代码:

任何帮助/建议将不胜感激。

环境:Visual Studio 2019 | MSVC-2019 | C++20 | 视窗 10 专业版