ぼく用あれこれまとめ

こうして僕はエラーにはまった。(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);"マクロを使う。
    • それに逃げていいのか、ほんとうにそれでいいのか。


参考リンク

記事メニュー
目安箱バナー