星期六, 6月 16, 2007

Error: unresolved external symbol _WinMain@16

  1. 如果你是用VS開新專案,然後手動加入source code
  2. 如果以前是用VS2003或是更早的版本,然後轉到VS2005上
  3. 想把一個Win32 Console Application增加 UI,但是背後的Console Window不知如何拿掉
  4. 想把專案的Console Window叫出來。
以上的狀況,常會遇到一個Error:[ unresolved external symbol _WinMain@16 referenced in
function ___tmainCRTStartup ]。其中,粗體字部分也許會不同。
這種問題是因為,Source Code中的main,也就是我們預計的程式enrty point 與VS預期的名字相異,造成VS抓不到entry point,當然就出現了unresolved symbol。
一般來說,是由於SubSystem沒設定好所造成的。 更改Linker->System->SubSystem即可
但如果你的程式中,有新舊兩種WinAPI,比如include 又加入新版的Window Form( 有design view的 ),此時VS可能會搞混,所以上面的方法就失效了。

今天花了4個小時左右,終於把這個問題搞懂.....Orz
重點記錄幾個地方:( 以VS2005為例 ) Project Configuration Property中
  1. General -> CRL support:如果用VS2005的Windows Form,是需要用到CRL( /crl )的,如果想把project compile成lib、dll,似乎要用/crl safe。
  2. C/C++ -> Preprocessor:Definitions 中,有無_CONSOLE、_WINDOWS、WINDOWS等。這個地方其實就等同設定#define _CONSOLE...等。
  3. C/C++ -> Precompiled Headers:一般是設定成stdafx.h。不設定....似乎也沒差。
  4. Linker -> System -> SubSystem:設定成 WINDOWS、CONSOLE兩類最常見。如果沒設定,VS會看你的main function來選擇
    1. CONSOLE:Win32 character-mode application. Console applications are given a console by the operating system. If main or wmain is defined, CONSOLE is the default.
    2. Extensible Firmware Interface:The EFI_* subsystems. See the EFI specification for more information. For example, see the Intel web site. The minimum version and default version is 1.0.
    3. NATIVE:Device drivers for Windows NT. If /DRIVER:WDM is specified, NATIVE is the default.
    4. POSIX:Application that runs with the POSIX subsystem in Windows NT.
    5. WINDOWS:Application does not require a console, probably because it creates its own windows for interaction with the user. If WinMain or wWinMain is defined, WINDOWS is the default.
  5. Linker -> Advanced -> Entry Point:其實就是指定你的main function的起始位置。這是用在當你選了SubSystem成Console或是Windows,VS卻認錯你的entry point。此時,用這邊手動指定即可。