今天在用dxut的时候出现一个奇怪的问题,设置都搞了但是还是报错
2>dxut.lib(DXUT.obj) : error LNK2019: 无法解析的外部符号 __imp__InitCommonControls@0,该符号在函数 "long __stdcall DXUTInit(bool,bool,wchar_t *,bool)" (?DXUTInit@@YGJ_N0PA_W0@Z) 中被引用
2>dxut.lib(DXUTmisc.obj) : error LNK2019: 无法解析的外部符号 _DXTraceW@20,该符号在函数 "long __stdcall DXUTTrace(char const *,unsigned long,long,wchar_t const *,bool)" (?DXUTTrace@@YGJPBDKJPB_W_N@Z) 中被引用
2>dxut.lib(DXUTmisc.obj) : error LNK2019: 无法解析的外部符号 _D3DXSaveSurfaceToFileW@20,该符号在函数 "long __cdecl DXUTSnapD3D9Screenshot(wchar_t const *)" (?DXUTSnapD3D9Screenshot@@YAJPB_W@Z) 中被引用
2>dxut.lib(DXUTmisc.obj) : error LNK2019: 无法解析的外部符号 _D3DX11SaveTextureToFileW@16,该符号在函数 "long __cdecl DXUTSnapD3D11Screenshot(wchar_t const *,enum D3DX11_IMAGE_FILE_FORMAT)" (?DXUTSnapD3D11Screenshot@@YAJPB_WW4D3DX11_IMAGE_FILE_FORMAT@@@Z) 中被引用
2>D:\project\trunk\Source\GameTest\Msvc\..\..\Lib\Win32Debug\GameTestProjectWin32Debug.exe : fatal error LNK1120: 4 个无法解析的外部命令
在msdn中找到 链接器工具错误 LNK2019 看到提供了一个工具 /VERBOSE 链接器选项
看了日志觉得应该是少添加了lib库。加上在其他地方看到一个 #define DXUT_AUTOLIB,可以自动添加缺少的lib库。于是加上了这个宏定义,在用/VERBOSE进行分析,发现:
第一个错误,找不到InitCommonControls是因为缺少添加comctl32.lib
2> 正在搜索 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\lib\comctl32.lib:
2> 已找到 __imp__InitCommonControls@0
2> 已在 dxut.lib(DXUT.obj) 中引用
2> 已加载 comctl32.lib(COMCTL32.dll)
第二个错误,找不到DXTraceW是因为缺少dxerr.lib
2> 正在搜索 e:\Microsoft DirectX SDK (June 2010)\Lib\x86\dxerr.lib:
2> 已找到 _DXTraceW@20
2> 已在 dxut.lib(DXUTmisc.obj) 中引用
2> 已加载 dxerr.lib(dxerrw.obj)
第三个错误,找不到D3DXSaveSurfaceToFileW是因为缺少d3dx9d.lib
2> 正在搜索 e:\Microsoft DirectX SDK (June 2010)\Lib\x86\d3dx9d.lib:
2> 已找到 _D3DXSaveSurfaceToFileW@20
2> 已在 dxut.lib(DXUTmisc.obj) 中引用
2> 已加载 d3dx9d.lib(d3dx9d_43.dll)
第四个错误,找不到D3DX11SaveTextureToFileW是因为缺少d3dx11d.lib
2> 正在搜索 e:\Microsoft DirectX SDK (June 2010)\Lib\x86\d3dx11d.lib:
2> 已找到 _D3DX11SaveTextureToFileW@16
2> 已在 dxut.lib(DXUTmisc.obj) 中引用
2> 已加载 d3dx11d.lib(d3dx11d_43.dll)
为了验证自己的想法,去掉了#define DXUT_AUTOLIB,加入#pragma comment(lib, "comctl32.lib"),果然就少了第一条错误,看来直接加入宏定义还是万能之策啊。
备注:但是#pragma comment(lib, "dxut.lib") #pragma comment(lib, "dxutopt.lib")这两个还是需要的哈
又碰到link错误:
2>KEEngine.lib(KEEngine.obj) : error LNK2001: 无法解析的外部符号 "public: static class CDXUTDialogResourceManager CD3DRender::g_DialogResourceManager" (?g_DialogResourceManager@CD3DRender@@2VCDXUTDialogResourceManager@@A)
2>D:\project\trunk\Source\GameTest\Msvc\..\..\Lib\Win32Debug\GameTestProjectWin32Debug.exe : fatal error LNK1120: 1 个无法解析的外部命令
想了想,加了#define DXUT_AUTOLIB应该不是链接库的问题,找了半天原来:
static变量没有在类外定义。