ошибка LNK2001: неразрешенный внешний символ _MessageBox - PullRequest
12 голосов
/ 08 ноября 2010

Я пытаюсь создать программу 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 во время линковки, так что не уверен, почему там все еще говорится о неразрешенных символах?

ОБНОВЛЕНИЕ:

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@16
demo.exe : fatal error LNK1120: 1 unresolved externals

ОБНОВЛЕНИЕ 2: Окончательный рабочий код!

.386
.model flat, stdcall
option casemap :none

extrn MessageBoxA@16 : PROC
extrn ExitProcess@4 : PROC

.data
        HelloWorld db "Hello There!", 0

.code
start:

        lea eax, HelloWorld
        mov ebx, 0
        push ebx
        push eax
        push eax
        push ebx
        call MessageBoxA@16
        push ebx
        call ExitProcess@4

end start

Ответы [ 2 ]

17 голосов
/ 08 ноября 2010

Правильные имена функций: MessageBoxA@16 и ExitProcess@4.

Почти все функции Win32 API являются stdcall, поэтому их имена украшены знаком @, за которым следуетколичество байтов, занятых их параметрами.

Кроме того, когда функция Win32 принимает строку, есть два варианта: один, который принимает строку ANSI (имя заканчивается на A), и другой, который принимаетСтрока Unicode (имя заканчивается на W).Вы предоставляете строку ANSI, поэтому вам нужна версия A.

Когда вы не программируете на ассемблере, компилятор позаботится об этих вопросах за вас.

5 голосов
/ 08 ноября 2010

Попробуйте добавить это до .data сегмента:

include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
...