Вызов printf в 64-битном MASM не работает (отлично работает)

Рассмотрим следующий код сборки (MASM) (helloworld.asm):

extern puts: PROC

.data
msg db 'hello world', 0Ah, 00

.code
main proc
    sub rsp, 40
    lea rcx, msg
    call puts
    add rsp, 40
    ret
main endp

End

Он прекрасно компилируется под Windows 7 (после установки необходимых инструментов разработки и настройки среды) и ведет себя как ожидалось:

$ ml64 helloworld.asm /link ucrt.lib vcruntime.lib msvcrt.lib /subsystem:console
[..]

$ helloworld.exe
hello world

Однако, если я заменю puts с printf в helloworld.asm в строке 1 и строке 10 компоновщик не может разрешить ссылку на printf:

$ ml64 helloworld.asm /link ucrt.lib vcruntime.lib msvcrt.lib /subsystem:console
[..]
helloworld.obj : error LNK2019: unresolved external symbol "printf" referenced in function "main".
helloworld.exe : fatal error LNK1120: 1 unresolved externals

В качестве бонуса: если я использую статические файлы библиотеки libucrt.lib, libvcruntime.lib а также libcmt.libработает с printf:

$ ml64 helloworld.asm /link libucrt.lib libvcruntime.lib libcmt.lib /subsystem:console
Microsoft (R) Macro Assembler (x64) Version 14.11.25547.0
Copyright (C) Microsoft Corporation.  All rights reserved.

 Assembling: helloworld.asm
Microsoft (R) Incremental Linker Version 14.11.25547.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/OUT:helloworld.exe
helloworld.obj
libucrt.lib
libvcruntime.lib
libcmt.lib
/subsystem:console

$ helloworld.exe
hello world

Это не имеет никакого смысла для меня. Я, очевидно, могу скомпилировать C-программу с cl который использует файлы динамической библиотеки (указав /MD флаг) и компоновщик не имеет проблем с разрешением printf условное обозначение.

Что здесь происходит и как это можно решить?

0 ответов

Другие вопросы по тегам