非常に躓きそうになるのでメモ。
__declspec(dllexport) を利用して、関数をエクスポートしているが、ふとReleaseビルド物件をDumpbinでExports一覧を見たところ、
FuncA = _FuncB
FuncB = _FuncB
FuncC = _FuncB
といった感じの関数名が表示されることがあった。
Relaseビルドだと起こる可能性がある現象。
Debugビルドだと、最適化無効なので、
FuncA = _FuncA
FuncB = _FuncB
FuncC = _FuncC
のように名前付けされるんだけど、なぜそうならないのかと悩むこと暫し。
#@付いたり変な名前付いたりする場合もあるけど、それぞれ異なる値になるはず。
Relaseビルドの場合、標準で最適化が有効になっているのだが、これ、エクスポート関数も、処理内容が同じだと1つに纏める、すごい最適化処理が行われているらしい。
関数の中身はあとで書くことにして、適当に済ませていると、同じ内容の処理は一纏めにされてしまう。
#中身をちゃんと書くと、別々の定義になる。
VC++の最適化、結構強力なので、たとえば、
int* Func(int* n, bool f) { /* あとで書く */ return n; }
__declspec(dllexport) int* FuncA(int* a) { return Func(a, true); }
__declspec(dllexport) int* FuncB(int* b) { return Func(b, false); }
__declspec(dllexport) double* funcC(double* c) { /* あとで書く */ return c; }
↑こんな状態のときにDumpbinすると、見られる。
#VS2010にて。
覚えておかないと、延々、プロジェクト定義とにらめっこすることになる。
コメントしちゃいなよ