1

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

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

#pragma once
int f();

const int value = f();

然后,我定义了一个主模块接口单元[m1.ixx OR 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): 对“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()

我理解错了吗?

4

1 回答 1

2

模块上下文中的“丢弃”仅表示从模块中的模板定义中查找找不到它(作为编译客户端的一部分被实例化)。它if constexpr. _ value显然 odr-uses的定义f,所以它必须在某个地方定义。

同时,您根本不应该在头文件中包含内部链接。value

于 2021-07-03T21:30:11.887 回答