我正在使用 Visual Studio 2008 并且在尝试导出编译器生成的赋值运算符(和复制构造函数)时遇到了问题。
这是代码:
class __declspec(dllexport) Example {
public:
Example () {}
};
当我从此代码创建 dll 时,我得到以下导出的符号:
1 0 00001010 ??0Example@@QAE@XZ = ??0Example@@QAE@XZ (public: __thiscall Example::Example(void))
2 1 00001000 ??4Example@@QAEAAV0@ABV0@@Z = ??4Example@@QAEAAV0@ABV0@@Z (public: class Example & __thiscall Example::operator=(class Example const &))
Ordinal 2 是编译器生成的赋值运算符。
我假设(看起来不正确)我可以使用 .DEF 文件来导出这两个相同的符号并删除 dllexport 指令。我想在一个更大的项目中执行此操作以隐藏符号。
class Example {
public:
Example () {}
};
和 .DEF 文件:
LIBRARY "dll"
EXPORTS
??0Example@@QAE@XZ
??4Example@@QAEAAV0@ABV0@@Z
当我尝试构建它时,我收到以下链接错误:
dll.exp : error LNK2001: unresolved external symbol "public: class Example & __thiscall Example::operator=(class Example const &)" (??4Example@@QAEAAV0@ABV0@@Z)
似乎删除 dllexport 后,编译器不再生成赋值运算符。为什么会这样?