неразрешенный внешний символ _WinMainCRTStartup - PullRequest
2 голосов
/ 21 ноября 2010

Я пытаюсь собрать простое приложение "Hello world" с Masm32. Он хорошо собирается, но когда я пытаюсь связать его, компоновщик говорит

ССЫЛКА: ошибка 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

На некоторых форумах я обнаружил, что это вызвано типом кодирования. Однако это не имеет значения для моей проблемы

Ответы [ 3 ]

2 голосов
/ 08 октября 2012

У вас есть 2 варианта:

  1. Переименуйте ваш ГЛАВНЫЙ в _WinMainCRTStartup
  2. Установите Windows (/ SUBSYSTEM: WINDOWS) в параметре Свойства / Конфигурация / Компоновщик -> Подсистема.
2 голосов
/ 25 ноября 2010

Компоновщик принимает имя по умолчанию для точки входа.У вас есть несколько вариантов.
1. Используйте библиотеки C на платформе, которые, поскольку вы используете MASM, я полагаю, вы не хотите.
2. Переименуйте вашу MAIN в _WinMainCRTStartup
3. Используйте «-entry: MAIN» в командной строке Link.exe (может потребоваться строка «public MAIN»)

1 голос
/ 07 мая 2015

Вы пропустили метку после оператора завершения. Это должна быть та же самая метка, с которой был помечен сегмент кода, в вашем случае Main. Так что вместо вашей последней строки:

END

изменить на

END MAIN

...