VS2017编写C++多文件时,出现LNK2005、LNK1169报错的解决方法

LNK2005,LNK1169

问题描述

在完成学校数据结构是实验课作业的时候,要求用多文件的形式完成作业,要求在list.h实现函数声明,list.cpp对函数进行具体定义,在main.cpp中进行调用

于是当我使用VS2017编写C++代码的时候,出现了

在这里插入图片描述

LNK2005,LNK1169报错

但是当时没有一个函数进行重定义

当时代码大概为

list.h

#include
#include
//结构类型
struct data
{
	int i[20];
	int length;
};
extern data;
int ListDelect(data *&L, int position, int &delectdata);
int Reverse(data *&L);
void CreatList(data* &L, int b[], int n);
void DestroyList(data* &L);
int ListInsert(data *&L, int position, int data);

list.cpp

#pragma once

#include"list.h"
//倒置
....省略函数具体定义

main.cpp

#include "list.cpp"
int main()
{
    ...
}

当时查询网上各种资料,比如忽略lib文件等方法

但是都没有解决问题

原因

大概原因是cpp文件不能直接include,因为会当在main.cpp文件中直接include .cpp文件会导致,重复调用某些库文件,而导致重定义的问题

但是当时由于数据结构题目要求,不能直接在.h文件里对进行定义,一直卡在那很久

后面在我朋友的指导下,才想出解决方法

解决方法

其实解决方法非常简单,只用将main.cpp中#include "list.cpp"的引用

改为对#include "list.h"的引用,就可以了

最开始我也有这个疑问,因为list.h文件中并没有对函数的具体定义,为什么可以直接调用。

大佬给我的解释是,当list.cpp#include "list.h"后,list.cpp和list.h就已经完成了链接了。

main.cpp中需要调用list.h的定义的函数时,由于list.h文件中没有对函数的定义时

list.h就会自动寻找,与他已经相链接的文件中,查找相关函数的定义,直到所有链接的文件全部查找结束或者找到了函数的定义为止

所以,即使list.h没有调用list.cpp文件,也能找到相关的定义

PS:这也证明了学习编程语言的时候基础一定要牢固~

你可能感兴趣的:(C++)