问题描述
当我在一个模块单元的全局模块片段中#include一个头文件时,我遇到了MSVC和GCC一起提供的一些链接错误。
#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;
}
/usr/bin/ld: /tmp/ccEkMykg.o: 在函数中 `__static_initialization_and_destruction_0(int,int)':
m1.cpp:(.text+0x1e): 对 `f()' 的未定义引用
严重性代码描述项目文件行抑制状态 Error 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:\用户\Glx\source\repos\Study2\Study2\m1.ixx.obj 1
在我的理解中,变量value和函数f()的声明应该被丢弃,因为它们是在全局模块片段 并且不被模块单元使用,所以即使我不提供函数的定义也没关系 f()。
我理解错了吗?
解决方法
模块上下文中的“丢弃”只是意味着它没有通过从模块中的模板定义中查找而找到(作为编译客户端的一部分被实例化)。它与 if constexpr
中丢弃的 语句 不同。 value
的定义显然是 odr 使用 f
,所以它必须在某处定义。
同时,您根本不应该在头文件中包含诸如 value
之类的内部链接。