未解决的外部符号_WinMainCRTStartup

3
我正在尝试使用Masm32组装一个简单的“Hello world”应用程序。它可以成功组装,但是当我尝试链接它时,链接器会报错:
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个回答

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

3

你有两个选项:

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

1
你缺少结束语句后的标签。它应该与代码段使用的标签相同,在你的情况下为Main。所以,你最后一行代码不应该是:

END

而应该改为:

END MAIN


1

前往项目属性 << 链接器 << 高级 << 入口点。

输入并添加 "MAIN"。

然后点击应用并按确定。

我使用的是Visual Studio 2019。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接