未解析的外部符号_WinMainCRTStartup

时间:2010-11-21 11:42:46

标签: assembly unresolved-external masm32

我正在尝试组建一个简单的“#Hello”世界"应用Masm32。它汇总很好但是当我尝试链接它时,链接器说

  

LINK:错误LNK2001:未解析的外部符号_WinMainCRTStartup   prog1.exe:致命错误LNK1120:1个未解析的外部

这是该计划的源代码:

.586P

.MODEL FLAT, STDCALL
STD_OUTPUT_HANDLE equ -11

; Prototypes of external procedures
EXTERN GetStdHandle@4:NEAR
EXTERN WriteConsoleA@20:NEAR
EXTERN ExitProcess@4: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 GetStdHandle@4
     MOV  HANDL, EAX


; Output the buffer contents to the console
     PUSH 0
     PUSH OFFSET NUMW
     PUSH NUMB
     PUSH OFFSET BUFER
     PUSH HANDL
     CALL WriteConsoleA@20

;Exit application
     PUSH 0
     CALL ExitProcess@4
_TEXT ENDS
END

我在一些论坛中发现这是由编码类型引起的。然而,它对我的​​问题似乎并不重要

4 个答案:

答案 0 :(得分:2)

链接器采用入口点的默认名称。 你有几个选择  1.在平台上使用C库,因为你使用的是MASM,我认为你不想这样做  2.将您的MAIN重命名为_WinMainCRTStartup
 3.在Link.exe命令行中使用“-entry:MAIN”(您可能需要“公共MAIN”行)

答案 1 :(得分:2)

您有2个选项:

  1. 将您的MAIN重命名为_WinMainCRTStartup
  2. 在属性/配置/链接器中设置Windows(/ SUBSYSTEM:WINDOWS) - >子系统选项。

答案 2 :(得分:1)

您在结束语句后缺少标签。它应该与代码段标记的标签相同,在您的案例中为Main。所以不是你的最后一行:

END

将其更改为

END MAIN

答案 3 :(得分:0)

转到项目属性<<链接器<<高级<<入口点。 输入并添加“MAIN”

然后点击应用并按确定。

我使用 Visual Studio 2019。