2010-11-21 100 views
1

我正試圖用Masm32組裝一個簡單的「Hello world」應用程序。它裝配精細,但當我嘗試鏈接,鏈接器說無法解析的外部符號_WinMainCRTStartup

LINK:錯誤LNK2001:解析外部符號_WinMainCRTStartup prog1.exe:致命錯誤LNK1120:1周無法解析的外部

這是該程序的源代碼:

.586P 

.MODEL FLAT, STDCALL 
STD_OUTPUT_HANDLE equ -11 

; Prototypes of external procedures 
EXTERN [email protected]:NEAR 
EXTERN [email protected]:NEAR 
EXTERN [email protected]:NEAR 

; INCLUDELIB directives for the linker 
includelib c:\masm32\lib\user32.lib 
includelib c:\masm32\lib\kernel32.lib 

;============ data segment ================= 
_DATA SEGMENT 
HANDL DWORD ? 
BUFER DB "Hello world\n", 0 
NUMB DWORD ? 
NUMW DWORD ? 
_DATA ENDS 

_TEXT SEGMENT 
MAIN: 
;====== Get the output handle ====== 
    PUSH STD_OUTPUT_HANDLE 
    CALL [email protected] 
    MOV HANDL, EAX 


; Output the buffer contents to the console 
    PUSH 0 
    PUSH OFFSET NUMW 
    PUSH NUMB 
    PUSH OFFSET BUFER 
    PUSH HANDL 
    CALL [email protected] 

;Exit application 
    PUSH 0 
    CALL [email protected] 
_TEXT ENDS 
END 

我發現在一些論壇,這是由編碼類型造成的。然而它似乎對我的問題並不重要

回答

2

鏈接器採用入口點的默認名稱。 你有幾個選擇。
1.使用平臺上的C庫,這是因爲您使用的是MASM,我假設您不想。
2.重命名你的主要以_WinMainCRTStartup
3.使用 「-entry:MAIN」 上LINK.EXE命令行(你可能需要一個 「公共主頁」 行)

2

你有2個選項:

  1. 重命名主要以_WinMainCRTStartup
  2. 設置Windows(/子系統:WINDOWS)在性能/配置/鏈接器 - >子系統選項。
1

您在結束語句後缺少標籤。它應該與代碼段標記的標籤相同,在您的情況下是Main。因此,而不是你的最後一行的存在:

END

改變它

END MAIN