• "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
    ");
    }
    
    
    //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中, 这样运行后没有报错. 另外, 由于是重定义发生了错误, 所以如果我们用内联函数, 这样在执行时是嵌入代码块, 这样也就不会再出现函数的重定义的问题.

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

  • 相关阅读:
    [杂题]FZU2190 非提的救赎
    [模拟]ZOJ3480 Duck Typing
    [模拟]ZOJ3485 Identification Number
    [数论]ZOJ3593 One Person Game
    [博弈]ZOJ3591 Nim
    [杂题]URAL1822. Hugo II's War
    二分图相关
    KMP算法详解
    中国国家集训队论文集目录(1999-2009)
    最短路Dijkstra算法的一些扩展问题
  • 原文地址:https://www.cnblogs.com/runsdeep/p/11157805.html
Copyright © 2020-2023  润新知