"fatal error LNK1169: 找到一个或多个多重定义的符号" 解决方案

本人在测试刚刚安装的vs2017时运行出了问题, 错误信息为 "fatal error LNK1169: 找到一个或多个多重定义的符号", 代码如下: 

//Myfile.h
#include<iostream>
#include<iomanip>
#include<cmath>
int fac(int n)
{
    int t = 1;
    for (int i = 1; i <= n; i++)
    {
        t *= i;
    }
    return t;
}
float max(float x1, float x2)
{
    return (x1 > x2 ? x1 : x2);
}
void menu()
{
    printf("hello world\n");
}


//test.cpp
#include "Myfile.h"
using namespace std;
int main()
{
    cout << fac(5) << endl;
    cout << max(3, 9) << endl;
    menu();

    return 0;
}

仔细思考了下报错原因, 在头文件包含到test.cpp时,  而实际上Myfile.h中包含了构造函数的实现,于是test.cpp生成目标文件的时候,包含了构造函数的实现。而test.cpp也包含了test.h,同样编译生成目标文件的时候,也会包含构造函数的实现。这样二者在链接阶段就会发现有两个一模一样的函数,出现了重定义的问题. 解决方法如下:

将函数的声明放在头文件Myfile.h里, 函数的定义则放在test.cpp中, 这样运行后没有报错. 另外, 由于是重定义发生了错误, 所以如果我们用内联函数, 这样在执行时是嵌入代码块, 这样也就不会再出现函数的重定义的问题.

同样的, 除了函数的定义不能在头文件里实现, 变量的定义以及类的方法的定义同样不能放在头文件里, 这样出现重定义报错的情况.

posted @ 2019-07-09 15:42  runsdeep  阅读(4127)  评论(0编辑  收藏  举报