2010年5月25日 星期二

Link error: unresolved external symbol __imp_CommandBar_XXXXXX

在編譯 CE下的 format程式時,選擇 windows program, 並且編譯 沒有問題。
因為要link storeapi.lib
但是當我在lib path 中include C:\WINCE\PUBLIC\COMMON\OAK\LIB\MIPS\RETAIL 時
會出現以下錯



1>ceformatw.obj : error LNK2019: unresolved external symbol __imp_CommandBar_AddAdornments referenced in function "long __cdecl WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YAJPAUHWND__@@IIJ@Z)
1>ceformatw.obj : error LNK2019: unresolved external symbol __imp_CommandBar_InsertMenubar referenced in function "long __cdecl WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YAJPAUHWND__@@IIJ@Z)
1>ceformatw.obj : error LNK2019: unresolved external symbol __imp_CommandBar_Create referenced in function "long __cdecl WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YAJPAUHWND__@@IIJ@Z)
1>ceformatw.obj : error LNK2019: unresolved external symbol __imp_CommandBar_Show referenced in function "int __cdecl InitInstance(struct HINSTANCE__ *,int)" (?InitInstance@@YAHPAUHINSTANCE__@@H@Z)

調查後發現 在Standard SDK下的 Commctrl.lib 和 PUBLIC\COMMON\OAK\LIB下的 Commctrl.lib 並不相同

SDK下的 Commctrl.lib 只是一個 dll import library
OAK\LIB 下的則為實際的 static library

但是Standard SDK 下的Commctrl.h 和 PUBLIC\COMMON\SDK\INC 下的 Commctrl.h
是一樣的。

在 commctrl.h

//
// Define API decoration for direct importing of DLL references.
//
#ifndef WINCOMMCTRLAPI
#if !defined(_COMCTL32_) && defined(_WIN32)
#define WINCOMMCTRLAPI DECLSPEC_IMPORT
#else
#define WINCOMMCTRLAPI
#endif
#endif // WINCOMMCTRLAPI



IN winnt.h
#if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC) || defined(_M_IA64)) && !defined(MIDL_PASS)
#define DECLSPEC_IMPORT __declspec(dllimport)
#else
#define DECLSPEC_IMPORT
#endif

所以 __imp_ 是Microsoft 為 dllimport 所加上的修飾詞

目前能想到的暫時解決方法(非完美)為
把Standard SDK 的Lib 也加入 在PUBLIC\COMMON\OAK\LIB 的前面





主要是 WINCOMMCTRLAPI 的定義
不應該跑到上面 DECLSPEC_IMPORT



沒有留言: