2010-11-21 281 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