3

我正在尝试用 Masm32 组装一个简单的“Hello world”应用程序。它组装得很好,但是当我尝试链接它时,链接器说

链接:错误 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 回答 4

4

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

于 2010-11-25T06:49:23.187 回答
3

您有 2 个选项:

  1. 将您的 MAIN 重命名为 _WinMainCRTStartup
  2. 在 Properties/Configuration/Linker -> SubSystem 选项中设置 Windows (/SUBSYSTEM:WINDOWS)。
于 2012-10-08T14:22:36.987 回答
1

您在 end 语句后缺少标签。它应该与代码段标记的标签相同,在您的情况下为 Main。因此,您的最后一行不是:

END

将其更改为

END MAIN

于 2015-05-07T16:59:46.943 回答
0

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

然后单击应用并按确定。

我使用视觉工作室 2019。

于 2021-08-10T08:34:46.037 回答