提问人:Triskeldeian 提问时间:2/9/2021 最后编辑:πάντα ῥεῖTriskeldeian 更新时间:2/9/2021 访问量:389
全局变量的未解析外部符号
Unresolved external symbol for global variable
问:
我一直在努力理解这个问题,希望有人能给我一些提示。我有一个使用漂亮的计数器习语定义的全局变量。
在头文件中,定义如下所示:
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中是否存在该符号,并且在导出的符号中似乎存在该符号。我真的不知道还能再尝试什么了。
有没有人遇到过这样的问题?
答:
1赞
Triskeldeian
2/9/2021
#1
所以问题是由于这个(从这里):
__declspec(dllimport) 可用于代码和数据,两者之间的语义略有不同。当应用于例程调用时,它纯粹是一种性能优化。对于数据,正确性是必需的。[...]如果从 DLL 导出数据项,则必须在访问它的代码中声明它。using 在函数声明上是可选的,但如果使用此关键字,编译器会生成更高效的代码。但是,必须用于导入可执行文件才能访问 DLL 的公共数据符号和对象。
__declspec(dllimport)
__declspec(dllimport)
__declspec(dllimport)
长话短说,对于函数和类,dllimport 是可选的,对于数据,例如全局变量,它是强制性的
评论
reinterpret_cast