“error LNK1169: 找到一個或多個多重定義的符號”的解決方案

來源:互聯網
上載者:User

問題描述如下:

有 三個源檔案,A.h、B.cpp、C.cpp。

A.h是標頭檔,其中聲明了三個變數a1、a2、 a3。

B.cpp是A.h中所聲明的類的實現原始碼,C.cpp是主程式檔案。B.cpp和C.cpp中均包含標頭檔 A.h。

在編譯時間,編譯能夠通過,但連結時出了問題,出現”error   LNK1169:   找到一個或多個多重定義的符號“的錯誤。

經過分析,確定了這是由於兩個實現檔案中重複包含了標頭檔而造成的。可解決方案卻始終找不到。

要 注意的是,在這裡,在標頭檔中加入#ifndef……#endif這樣的先行編譯命令是沒用的,因為這是防止嵌套包含標頭檔的,而本例中並沒有嵌套包含,是 在兩個檔案中分別包含。

因為這三個變數在兩個實現檔案中都要用到,所以一定要包含在A.h中。後來在網上找到瞭解決方法,其實很簡單。

就是在A.h中的三個變數聲明前加上extern 關鍵字,然後在B.cpp中不加extern關鍵字再次聲明這三個變數。於是編譯連結順利通過。

其實這是C++中比較基礎的問題。
還有種情況是定義了函數,但在另個檔案中準備用#include開啟,但是結果還是會出現。

直接包含不就在兩個cpp檔案中都定義了相同的函數/變數嗎,連結時會出現重複定義(你自己試試),所以需要使用extren申明一下即可,他們使用的是同一個實體。

例如:
1、你在a.cpp中定義了一個函數
void func()
{
}

希望在b.cpp中調用,調用前就需要進行聲明,格式如下:
extren void func(); //extren 後面根的形式和函數定義形式要完全相同

void mian()
{
    func();
}

2、1、你在a.cpp中定義了一個變數  int a;

希望在b.cpp中使用,使用前就需要進行聲明,格式如下:
extren int a; //extren 後面根的形式和變數定義形式要完全相同

void main()
{
    int b = a;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.