Как исправить masm32: ошибка LNK2001: неразрешенный внешний символ

Я создаю приложение для тестирования API-функции IsCharLowerA, а затем выводю res с помощью MessageBoxA. Я использую masm32.

link /SUBSYSTEM:WINDOWS kod.obj
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

kod.obj : warning LNK4033: converting object format from OMF to COFF
kod.obj : error LNK2001: unresolved external symbol __ExitProcess@4
kod.obj : error LNK2001: unresolved external symbol __MessageBoxA@16
kod.obj : error LNK2001: unresolved external symbol __imp__printf
kod.obj : error LNK2001: unresolved external symbol __imp__scanf
kod.obj : error LNK2001: unresolved external symbol _IsCharLowerA@4
LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup
ml kod.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: kod.asm
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/z2
"kod.obj"
"kod.exe"
NUL
LINK : warning LNK4044: unrecognized option "z2"; ignored
kod.obj : warning LNK4033: converting object format from OMF to COFF
LINK : fatal error LNK1181: cannot open input file "kod.exe"

Я пробовал использовать microsoft masm32 (для компиляции кода в Visual Studio), но когда приложение запускается, оно запрашивает только символ, а затем закрывается. Мне не удалось выполнить отладку из-за ошибки «Источник недоступен».

Некоторый код:

.586 
.model flat, stdcall 
option casemap: none 

include C:\masm32\include\windows.inc 
include C:\masm32\include\kernel32.inc 
include C:\masm32\include\user32.inc 
include C:\masm32\include\msvcrt.inc

includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\user32.lib 

.data
msg db 'Enter char: ', 0
messagebox_title db ' Лабораторна робота № 5 ', 0
result_0 db ' NOT LOWERCASE ', 0
result_1 db ' LOWERCASE ', 0
scan_modifier db '%c', 0    

.data?
scan_res dd ?

.code
start:  
    push ebp
    mov ebp, esp

    invoke crt_printf, OFFSET msg

    invoke crt_scanf, OFFSET scan_modifier, scan_res

    push scan_res
    call IsCharLowerA

    push 0
    push offset messagebox_title        

    cmp eax, 0
    jne notNULL
    push offset result_0
    jmp next
notNULL:
    push offset result_1
next:
    push 0                           
    call MessageBoxA          

    push 0                        
    call ExitProcess   

    pop ebp
end start

Обновление №1: (изменено MessageBoxA -> MessageBoxA @ 16 и др.)

Код:

.586 
.model flat, stdcall 
option casemap: none 

include C:\masm32\include\windows.inc 
include C:\masm32\include\kernel32.inc 
include C:\masm32\include\user32.inc 
include C:\masm32\include\msvcrt.inc

includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\user32.lib 

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

.data
msg db 'Enter char: ', 0
messagebox_title db ' Лабораторна робота № 5 ', 0
result_0 db ' NOT LOWERCASE ', 0
result_1 db ' LOWERCASE ', 0
scan_modifier db '%c', 0    

.data?
scan_res dd ?

.code
start:  
    push ebp
    mov ebp, esp

    invoke crt_printf, OFFSET msg

    invoke crt_scanf, OFFSET scan_modifier, scan_res

    push scan_res
    call IsCharLowerA

    push 0
    push offset messagebox_title        

    cmp eax, 0
    jne notNULL
    push offset result_0
    jmp next
notNULL:
    push offset result_1
next:
    push 0                           
    call MessageBoxA@16          

    push 0                        
    call ExitProcess@4   

    pop ebp
end start

Res:

link /SUBSYSTEM:WINDOWS kod.obj
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

kod.obj : warning LNK4033: converting object format from OMF to COFF
kod.obj : error LNK2001: unresolved external symbol _MessageBoxA@16
kod.obj : error LNK2001: unresolved external symbol __imp__printf
kod.obj : error LNK2001: unresolved external symbol _ExitProcess@4
kod.obj : error LNK2001: unresolved external symbol __imp__scanf
kod.obj : error LNK2001: unresolved external symbol _IsCharLowerA@4
LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup
kod.exe : fatal error LNK1120: 6 unresolved externals

У меня есть код ошибка LNK2001: неразрешенный внешний символ _MessageBox (загружено № 2 " Окончательный рабочий код ") тоже не удается связать


person SageCat    schedule 10.11.2019    source источник
comment
Похож на stackoverflow.com/questions/4123013 /   -  person Joachim Isaksson    schedule 10.11.2019
comment
@JoachimIsaksson Нет, это не так. Загружен результат.   -  person SageCat    schedule 10.11.2019
comment
Вы добавили extrn строк из примера? В любом случае, я не могу проверить себя на этом компьютере, поэтому, если он не сработает, мне придется оставить это кому-то, кто может :)   -  person Joachim Isaksson    schedule 10.11.2019
comment
@JoachimIsaksso Извините, теперь новый код загружен.   -  person SageCat    schedule 10.11.2019
comment
Другой вопрос не использует начальное подчеркивание в именах символов в extrn или вызовах, которые могут повлиять на ваш результат.   -  person Joachim Isaksson    schedule 10.11.2019
comment
@JoachimIsaksso, на самом деле ничего не изменилось. Загружено в обновление №1   -  person SageCat    schedule 10.11.2019
comment
Я посмотрю, успею ли я проверить это сам на компьютере, который может запускать masm, но пока я не могу больше помочь, извините.   -  person Joachim Isaksson    schedule 10.11.2019
comment
@JoachimIsaksso У меня есть его код stackoverflow.com/ questions / 4123013 / (загружено 2 Окончательных рабочих кода) тоже не удается связать, то же самое: неупорядоченный внешний символ для messageboxa и exitprocess   -  person SageCat    schedule 10.11.2019
comment
@JoachimIsaksso О, все хорошо, не волнуйтесь! Спасибо за помощь)   -  person SageCat    schedule 10.11.2019


Ответы (1)


Проблемы были:

  • 1) Для scanf нужен OFFSET scan_res, потому что не нужно значение.
  • 2) Не может быть скомпилирован с использованием как оконной, так и консольной подсистемы. Поэтому я использовал только printfs.

  • 3) Не хватало библиотеки msvcrt.

  • 4) Преобразование из OMF в COFF можно игнорировать.

Рабочий код:

.586 
.model flat, stdcall 
option casemap: none 

include C:\masm32\include\windows.inc 
include C:\masm32\include\user32.inc 
include C:\masm32\include\msvcrt.inc

includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\user32.lib 

.data
msg db 'Enter char: ', 0
result_0 db ' NOT LOWERCASE ', 0
result_1 db ' LOWERCASE ', 0
scan_modifier db '%c', 0    

.data?
scan_res dd ?

.code
start:  
    mov ebp, esp

    invoke crt_printf, OFFSET msg

    invoke crt_scanf, OFFSET scan_modifier, OFFSET scan_res

    push scan_res
    call IsCharLowerA    

    cmp eax, 0
    jne notNULL
    invoke crt_printf, OFFSET result_0
    jmp next
notNULL:
    invoke crt_printf, OFFSET result_1
next:                                                         
    ret
end start
person SageCat    schedule 12.11.2019