Ошибка LNK2001: неразрешенный внешний символ _MessageBox
Я пытаюсь создать программу helloworld, используя только masm, а не masm32 libs. Вот фрагмент кода:
.386
.model flat, stdcall
option casemap :none
extrn MessageBox : PROC
extrn ExitProcess : PROC
.data
HelloWorld db "Hello There!", 0
.code
start:
lea eax, HelloWorld
mov ebx, 0
push ebx
push eax
push eax
push ebx
call MessageBox
push ebx
call ExitProcess
end start
Я могу собрать это с помощью masm:
c:\masm32\code>ml /c /coff demo.asm
Microsoft (R) Macro Assembler Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.
Assembling: demo.asm
Однако я не могу связать его:
c:\masm32\code>link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user
32.lib demo.obj
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.
demo.obj : error LNK2001: unresolved external symbol _MessageBox
demo.obj : error LNK2001: unresolved external symbol _ExitProcess
demo.exe : fatal error LNK1120: 2 unresolved externals
Я включаю libs во время связывания, поэтому не уверен, почему он все еще говорит неразрешенные символы?
UPDATE:
c:\masm32\code>link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user
32.lib demo.obj
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.
demo.obj : error LNK2001: unresolved external symbol [email protected]
demo.exe : fatal error LNK1120: 1 unresolved externals
ОБНОВЛЕНИЕ 2: Окончательный рабочий код!
.386
.model flat, stdcall
option casemap :none
extrn [email protected] : PROC
extrn [email protected] : PROC
.data
HelloWorld db "Hello There!", 0
.code
start:
lea eax, HelloWorld
mov ebx, 0
push ebx
push eax
push eax
push ebx
call [email protected]
push ebx
call [email protected]
end start
Ответы
Ответ 1
Правильными именами функций являются [email protected]
и [email protected]
.
Почти все функции API Win32 являются stdcall, поэтому их имена украшены знаком @
, за которым следует количество принятых байтов по их параметрам.
Кроме того, когда функция Win32 принимает строку, существует два варианта: один, который принимает строку ANSI (имя заканчивается на A
), и когда используется строка Unicode (имя заканчивается на W
). Вы поставляете строку ANSI, поэтому вам нужна версия A
.
Когда вы не программируете в сборке, компилятор заботится о них для вас.
Ответ 2
Попробуйте добавить это до сегмента .data
:
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib