2010-11-08 18 views
11

Próbuję stworzyć program helloworld używając tylko masm a nie masm32 libs. Oto fragment kodu:błąd LNK2001: nierozwiązany symbol zewnętrzny _MessageBox

.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 

jestem w stanie zmontować to przy użyciu 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 

Jednak jestem w stanie go połączyć:

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 

jestem łącznie z bibliotekami podczas łączenia, więc nie wiesz, dlaczego wciąż mówi nierozwiązane symbole?

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 

UPDATE 2: Final kod roboczych!

.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 

Odpowiedz

17

Poprawne nazwy funkcji są [email protected] i [email protected].

Prawie wszystkie funkcje Win32 API są stdcall, czyli their names are decorated ze znakiem @, po którym następuje liczba bajtów pobranych przez ich parametry. Dodatkowo, gdy funkcja Win32 przyjmuje ciąg, istnieją dwa warianty: jeden, który przyjmuje ciąg ANSI (nazwa kończy się na A) i taki, który pobiera ciąg znaków Unicode (nazwa kończy się na W). Podajesz ciąg ANSI, więc chcesz wersję A.

Jeśli nie programujesz w zestawie, kompilator zajmie się tymi punktami za Ciebie.

+0

Dzięki! Rozwiązało to jeden z błędów łącza, ale nie drugiego. Zobacz aktualizację – Jumbo

+0

Dobrze, zobacz moją edycję. –

+0

Awesome! działało idealnie teraz. Czuję się taki n00b - czy możesz zaproponować jakieś dokumenty/książki, z których mogę wybrać te wszystkie rzeczy? MSDN jest zbyt zniechęcający do odkrywania, gdy jesteś nowicjuszem. – Jumbo

5

Spróbuj dodać ten przed .data segmentu:

include \masm32\include\kernel32.inc 
include \masm32\include\user32.inc 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\user32.lib 
Powiązane problemy