今天在移植一個C++代碼到EVC上,出現了如下一些錯誤:
"corelibc.lib(pegwmain.obj) : error LNK2019: unresolved external symbol WinMain referenced in function WinMainCRTStartup",和"corelibc.lib(wwinmain.obj) : error LNK2019: unresolved external symbol wWinMain referenced in function wWinMainCRTStartup"。
解決這些錯誤又讓我知道了如何在EVC上編譯wince console Application(EVC 控制台程式和瞭解main()、WinMain()、wmain()、 _tmain()、DllMainCRTStartup 、mainWCRTStartup 、WinMainCRTStartup 這些的驅別,現總結整理如下:
1、今天在移植一個C++代碼到EVC上,入口函數是int main (int argc, char ** argv),建立EVC WCE Application工程,並包含相關代碼,編譯並修改了一些錯誤,最後的錯誤如下:"corelibc.lib(pegwmain.obj) : error LNK2019: unresolved external symbol WinMain referenced in function WinMainCRTStartup",按照一些網友的說法,又在屬性—〉Linker—〉Anvanced—〉EntryPoint將
WinMainCRTStartup 更改為 wWinMainCRTStartup,結果仍然出錯為
"corelibc.lib(wwinmain.obj) : error LNK2019: unresolved external symbol wWinMain referenced in function wWinMainCRTStartup",剖析器和錯誤原因,是因為WinMainCRTStartup 或wWinMainCRTStartup 會調用WinMain 或wWinMain,而在移植的C++代碼沒有相應的實現,即win32程式是以一個WinMain函數作為程式的進入點,主程式為Winmain,不是main,所以出錯。
由於現在的這個程式是控制台程式,所以我就想建立wince console Application,但在EVC上沒有這個wce console Application,所以在網上尋找相關資料,總算知道如何在EVC上建立控制台程式,
2、如何在EVC上建立控制台程式
Below are steps to write a console application using eVC:
Step1: Open eVC, and create a new project: File --> New... --> WCE Application --> OK.
Step2: Choose "An empty project"
Step3: Create a new C++ source file, and in that file, add #include "windows.h"
Step4: Moreover add the following codes in above C++ source file as entry point:
int WINAPI _tmain(int argc, char ** argv)
{
printf("Hello mike!");
return 0;
}
Step5: Project --> Settings --> Link tab --> Category = Output-->Entry-point symbol: WinMainCRTStartup ==> mainWCRTStartup
最後編譯工程就可以了。
3、整理收集的資料
win32程式是以一個WinMain函數作為程式的進入點,而在你的程式中無法找到這個函數,所以無法產生可執行檔。Win32程式的主程式為Winmain,不是main.
main()是WINDOWS的控制台程式(32BIT)或DOS程式(16BIT), 是c/c++的標準入口函數名
WinMain()是WINDOWS的GUI程式, 是windows api表單程式的入口函數
wmain()是UNICODE版本的main(),
_tmain()是個宏,如果是UNICODE則他是wmain()否則他是main()
DllEntry/DllMain -- calls entry supplied by module. Does NOT call C++ static ctors/dtors
DllMainCRTStartup - calls C++ static ctors & dtors. Then calls module's DllMain
WinMain -- calls module's standard EXE entry point. Does NOT call C++ static ctors/dtors
WinMainCRTStartup -- Calls C++ static ctors, then calls module's WinMain
mainWCRTStartup -- for console apps whose entry is wmain(int argc, WCHAR **argv). Also calls C++ ctors/dtors
mainACRTStartup -- for console apps whose entry is main(int argc, char **argv). Also calls C++ ctors/dtors