首页  编辑  

微软link报错error LNK2001: 无法解析的外部符号 _printf

Tags: /C_C++/   Date Created:
对于使用控制台输出的C/C++或者汇编程序,我们可以正常编译为 .obj 文件,但是当我们链接输出exe的时候,经常会碰到以下错误:
例如对于 demo.c:
#include <stdio.h>
int main()
{
    printf("hello world");
}
如果直接用 cl demo.c 是可以正常输出 demo.exe的。如果我们用下面的指令就会有问题:
cl /c demo.c
link /subsystem:console /nodefaultlib /entry:main demo.obj
报错:
Microsoft (R) Incremental Linker Version 14.36.32537.0
Copyright (C) Microsoft Corporation.  All rights reserved.

demo.obj : error LNK2019: 无法解析的外部符号 ___acrt_iob_func,函数 _printf 中引用了该符号
demo.obj : error LNK2019: 无法解析的外部符号 ___stdio_common_vfprintf,函数 __vfprintf_l 中引用了该符号
demo.exe : fatal error LNK1120: 2 个无法解析的外部命令
如果是用nasm、gcc、tcc或者其他编译器编译的obj文件,link的时候也可能报错误。
例如,对于以下 a.asm 汇编程序:
extern printf
SECTION .data
	msg db 'Hello World!', 0Ah 
 
SECTION .text
global main
 
main:
	push msg
	call printf
	add esp, 4
	ret
使用nasm汇编:
nasm.exe -f win32 a.asm --prefix _ -o a.obj
link:
link a.obj
报错:
error LNK2001: 无法解析的外部符号 _printf
LINK : error LNK2001: 无法解析的外部符号 _mainCRTStartup
a.exe : fatal error LNK1120: 2 个无法解析的外部命令
如果用下面的指令:
link /subsystem:console /defaultlib:msvcrt.lib /entry:main a.obj /out:a.exe
报错:
Microsoft (R) Incremental Linker Version 14.36.32537.0
Copyright (C) Microsoft Corporation.  All rights reserved.

a.obj : error LNK2001: 无法解析的外部符号 _printf
a.exe : fatal error LNK1120: 1 个无法解析的外部命令
此时用gcc可以正常连接:
gcc -mconsole a.obj