ぼく用あれこれまとめ
こうして僕はエラーにはまった。(DxErr.hとDXTrace関数編)
最終更新:
bokuyo
-
view
こうして僕はエラーにはまった。(DxErr.hとDXTrace関数編)
ぼくの環境編
- VisualC++2010 Express
- DirectX SDK June2010
- error多すぎて泣きたい
DXTRACE_MSG()マクロのようなDXTrace関数を使用すると起きるっぽいビルドエラー
1>unco.obj : error LNK2019: 未解決の外部シンボル _DXTraceA@20 が関数 "void __cdecl unco(void)" で参照されました。 1>c:\Debug\unco.exe : fatal error LNK1120: 外部参照 1 が未解決です。
解決策
- 「祈る」…それしかない。天に祈りが届くまで待つしかない。
- 解決策はソースの先頭に"#pragma comment (lib, "DxErr.lib")"を追加。
"error LNK2019"
- 「おにいちゃん、DXTraceA()関数が呼び出されてるけど、どこに定義されてるの?探しても見つからないの…。」ってエラー。
- ちなみに"DXTRACE_MSG()マクロ"はDXTraceA()関数として置き換えられる。
- DXTraceA()関数は<DxErr.h>内で宣言されてる
エラーが起きてなぜとまどっていたのか、そのときのログ
- いや、間違いない!俺は言われた通りに、すべてのインクルードディレクトリも設定したし、ライブラリも設定したし、pragmaで追加の依存関係を設定した!それなのに、なぜ!?
- VC++ディレクトリ>インクルードディレクトリ、VC++ディレクトリ>ライブラリディレクトリはちゃんと設定してる。
- #pragma commentにて、"dxguid.lib","d3d9.lib","d3dx9.lib"をリンク。
- そんな状態で、Releaseビルドは通って動くのに、Debugビルドにした途端ビルドエラーでちゃう
- Releaseでしかディレクトリとかリンカとか設定していないのでは?->設定してる…と思う
HRESULT WINAPI DXTraceA( __in_z const char* strFile, __in DWORD dwLine, __in HRESULT hr, __in_z_opt const char* strMsg, __in BOOL bPopMsgBox );
- ってかんじで<DxErr.h>に宣言はされている。だけど、VC++2010の得意技、右クリック->[定義へ移動]で定義にとべない。
- おや、ということは、本当にerrorメッセージ通りだ。さすがだ。
そもそもDXTRACE_MSGマクロの定義が<DxErr.h>内で
#if defined(DEBUG) | defined(_DEBUG) #define DXTRACE_MSG(str) DXTrace( __FILE__, (DWORD)__LINE__, 0, str, FALSE ) #define DXTRACE_ERR(str,hr) DXTrace( __FILE__, (DWORD)__LINE__, hr, str, FALSE ) #define DXTRACE_ERR_MSGBOX(str,hr) DXTrace( __FILE__, (DWORD)__LINE__, hr, str, TRUE ) #else #define DXTRACE_MSG(str) (0L) #define DXTRACE_ERR(str,hr) (hr) #define DXTRACE_ERR_MSGBOX(str,hr) (hr) #endif
- こうなってる。つまり
- Debug時と、Release時で動きが違う。さすがマクロ。
- Debug時は、DXTRACE_MSG()マクロは、DXTraceA()関数に置き換えられる。
- Release時は、long型整数の"0"に置き換えられる。
- なるほど、だからRelease時は問題なく動くのか。
っていうことで、
- <DxErr.h>をincludeしてるくせに、"#pragma comment (lib, "DxErr.lib")"を書いてなかったことが敗因。
- ちょい昔だと<dxerr9.h>でその場合は、"#pragma comment (lib, "dxerr9.lib")"を追加。
- 他の解決策は、DXTRACE_MSG()マクロの代わりに、"MessageBox(NULL, "あああ", NULL, MB_OK);"マクロを使う。
- それに逃げていいのか、ほんとうにそれでいいのか。
参考リンク
- MSDN - DXTRACE_MSG マクロ - <DxErr.h>じゃなくて<dxerr9.h>だ!
- MSDN - DXTRACE_MSG
- MSDN - DXTrace 関数
- http://www.gamedev.net/topic/477799-project-compiles-but-wont-link/(英語) - まったく同じようなことを質問してる方がいました。