【问题标题】:Unresolved external symbol for global variable全局变量的未解析外部符号
【发布时间】:2021-05-12 14:35:46
【问题描述】:

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

在头文件中定义如下:

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 中,并且它似乎存在于导出的符号中。我真的不知道还能尝试什么。

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

【问题讨论】:

  • 你能reinterpret_cast参考吗?
  • 是的,这不是问题。例如在这里查看漂亮计数器的标准实现en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter
  • 看起来有点过分,但确实如此。
  • PS 我认为问题是在使用标头定位外部 DLL 的符号时,我必须在 dllexport 和 dllimport 之间切换。太烦人了……明天我会再做一些测试,但我认为这可能会解决它
  • @Triskeldeian Windows 机器上的哪个编译器? MSVC 还是 GCC? DLL 运行时链接和存根的链接器路径设置也可能是相关信息。

标签: c++ windows linker-errors dllimport


【解决方案1】:

所以问题是由于这个(来自here):

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

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

【讨论】:

    猜你喜欢
    • 2013-07-04
    • 2011-02-09
    • 2021-10-17
    • 2015-06-27
    • 2021-12-04
    • 2020-04-10
    相关资源
    最近更新 更多