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 ファイルを使用してこれらの同じ 2 つのシンボルをエクスポートし、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 が削除されると、コンパイラは代入演算子を生成しなくなったようです。これはなぜでしょうか?