当我在一个模块单元的全局模块片段中包含一个头文件时,我在一起遇到了MSVC和GCC提供的一些链接错误。
首先,我有一个头文件"Header.h"如下:
#pragma once
int f();
const int value = f();然后,我定义了一个主模块接口单元m1.ixx或m1.cpp,如下所示:
module;
#include "Header.h"
export module m1;
export {
inline int value2 = 0; // Not use anything in Header.h
}最后,我在"main.cpp"中导入了模块,并构建了如下所示的示例"main.cpp":
import m1;
#include <iostream>
int main()
{
using namespace std;
cout << value2 << endl;
}我从GCC11获得了一些链接错误:
/usr/bin/ld: /tmp/ccEkMykg.o:函数
\_\_static\_initialization\_and\_destruction\_0(int, int)': m1.cpp:(.text+0x1e): undefined reference tof()‘
与MSVC类似的链接错误:
C:\Users\Glx\source\repos\Study2\x64\Debug\Study2.exe
严重性代码描述项目文件行抑制状态错误LNK1120 1未解析的外部环境Study2 Study2 1
严重程度代码描述项目文件行抑制状态错误LNK2019未解析的外部符号"int __cdecl f(void)“(?f@@YAHXZ)在函数"void __cdecl‘动态初始化器for’value‘(Void)”(??__Evalue@@YAXXZ) Study2 Study2 1中引用
在我的理解中,变量值和函数f()的声明应该是丢弃的,因为它们是全局模块片段中的声明,不能被模块单元使用,所以即使我不为e 225E 126f()E 227提供函数的定义,也没关系。
,我理解错了吗?
发布于 2021-07-03 21:30:11
模块上下文中的“丢弃”仅仅意味着从模块中的模板定义中查找不到它(作为编译客户端的一部分被实例化)。这并不意味着与if constexpr中丢弃的语句相同。value的定义--直接使用f,所以必须在某个地方定义它。
同时,您根本不应该将internal-linkage之类的东西放在头文件中。
https://stackoverflow.com/questions/68235236
复制相似问题