全局变量的未解析外部符号

Unresolved external symbol for global variable

提问人:Triskeldeian 提问时间:2/9/2021 最后编辑:πάντα ῥεῖTriskeldeian 更新时间:2/9/2021 访问量:389

问:

我一直在努力理解这个问题,希望有人能给我一些提示。我有一个使用漂亮的计数器习语定义的全局变量。

在头文件中,定义如下所示:

BOOST_SYMBOL_EXPORT extern MyClass& GVar;

在源文件中,我有以下内容:

MyClass& GVar = reinterpret_cast<MyClass&>(Buffer);

在 Debian 和 Ubuntu 上使用 GCC,一切都被正确编译和链接。但是,在 Windows 上,尝试将 DLL 链接到我的测试可执行文件时出现以下错误:

error LNK2001: unresolved external symbol "class MyClass& GVar" (GVAR_MANGLED_NAME)

我还检查了DLL中是否存在该符号,并且在导出的符号中似乎存在该符号。我真的不知道还能再尝试什么了。

有没有人遇到过这样的问题?

C++ Windows 链接器错误 dllimport

评论

0赞 tadman 2/9/2021
你能提供参考吗?reinterpret_cast
1赞 Triskeldeian 2/9/2021
是的,这不是问题。例如,在此处查看漂亮的计数器 en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter 的标准实现
0赞 tadman 2/9/2021
似乎有点过分,但可以肯定的是。
0赞 Triskeldeian 2/9/2021
PS:我认为问题在于,当使用标头查找外部DLL的符号时,我必须在dllexport和dllimport之间切换。太烦人了......我明天会再做一些测试,但我认为这可能会解决它
1赞 πάντα ῥεῖ 2/9/2021
@Triskeldeian Windows 机器上的哪个编译器?MSVC 还是 GCC?此外,DLL 运行时链接和存根的链接器路径设置可能是相关信息。

答:

1赞 Triskeldeian 2/9/2021 #1

所以问题是由于这个(从这里):

__declspec(dllimport) 可用于代码和数据,两者之间的语义略有不同。当应用于例程调用时,它纯粹是一种性能优化。对于数据,正确性是必需的。[...]如果从 DLL 导出数据项,则必须在访问它的代码中声明它。using 在函数声明上是可选的,但如果使用此关键字,编译器会生成更高效的代码。但是,必须用于导入可执行文件才能访问 DLL 的公共数据符号和对象。__declspec(dllimport)__declspec(dllimport)__declspec(dllimport)

长话短说,对于函数和类,dllimport 是可选的,对于数据,例如全局变量,它是强制性的