"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中, 這樣運行后沒有報錯. 另外, 由於是重定義發生了錯誤, 所以如果我們用內聯函數, 這樣在執行時是嵌入代碼塊, 這樣也就不會再出現函數的重定義的問題.

同樣的, 除了函數的定義不能在頭文件里實現, 變量的定義以及類的方法的定義同樣不能放在頭文件里, 這樣出現重定義報錯的情況.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM