当我在一个模块单元的全局模块片段中#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()。
我理解错了吗?