LNK2005 已经在*.obj中定义 排雷

本文探讨了在C编程中遇到LNK2005错误的原因,即由于不正确的编译顺序导致同一文件被重复编译。通过理解头文件的作用和编译流程,提出去掉不必要的#include并确保文件编译顺序的方法。实例展示了如何通过调整代码结构来避免此类问题。
摘要由CSDN通过智能技术生成

项目场景:

项目场景:在写c的时候使用#include调用同级目录下另一文件中的函数时,出现LNK2005 已经在*.obj中定义 错误   

本人使用的编译环境为visual studio 2019


问题描述

在新手写c时,调用main.c同级下的另一文件中的函数时出现报错,提示已经在.obj中编译


原因分析:

提示:没有注意到程序编译的顺序,导致重复编译同一文件


解决方案:

提示:去掉#include调用,我的理解是:因为#include调用之后对同级目录下的文件已经完成了编译,所以在main函数中再一次调用这个函数,就会产生重复调用的结果,导致报错。

我的代码:

t.c

#include"y.h"

int main()
{
	shu();
	_tmp_lyy();
	return 0;
}

y.h

                                 
#include <stdlib.h>                                 
#include <string.h>


void shu(void) 
{
	printf("%d\n", 56);
}

tt.c

#include<stdio.h>
void _tmp_lyy(void) 
{
	printf("zxc");
}

注意:这里说明一下,使用.h头文件只是为了尝试通过头文件而解决报错。我们可以看到

        我们可以看到,这三个文件只有一个<stdio.h>引用,但是程序并没有报错,而<stdio.h>又在tt.c中,所以由此判断应该这三个文件中最先编译完成的应该是tt.c,所以再编译y.h时才没有报错——找不到printf函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值