因此,有人找到一個項目,該項目與對象(使用Visual Studio 2010)中已經定義的錯誤LNK2005:符號鏈接失敗。在這種情況下,我知道什麼是錯誤的(因此可以指出他們正確的解決方案),但我不知道爲什麼這是錯誤的水平給予一個很好的解釋(以防止它發生再次)。我該如何解釋這個LNK2005?
// something.h
#ifndef _SOMETHING_H
#define _SOMETHING_H
int myCoolFunction();
int myAwesomeFunction() // Note implementing function in header
{
return 3;
}
#endif
-
// something.cpp
#include "something.h"
int myCoolFunction()
{
return 4;
}
-
// main.cpp
#include <iostream>
#include "something.h"
int main()
{
std::cout << myAwesomeFunction() << std::endl;
}
此失敗連接,並且通過將myAwesomeFunction()插入的.cpp和留在.H聲明固定。
我對鏈接器工作原理的理解來自here。就我的理解,我們提供了一個在一個地方需要的符號。
我擡起頭看MSDN article on LNK2005,它符合我期望鏈接器行爲的方式(不止一次提供符號 - >鏈接器被混淆),但似乎沒有涵蓋這種情況(這意味着我不理解某些東西關於鏈接顯而易見)。
谷歌和StackOverflow上的人不包括成品率問題的#ifndef
或#pragma once
(這會導致提供的符號的多個聲明)
A related question I found on this site有同樣的問題,但得到的答覆並沒有解釋爲什麼我們是充分理解這個問題。
我有一個問題,我知道解決的辦法,但我不知道爲什麼我的解決方案的工作
如果通過預處理器運行所有的.cpp文件,那麼計算'myAwesomeFunction()'有多少個全局名稱空間實例可能會更有意義。你知道問題出在哪裏,未來避免這個「問題」的解決方案是微不足道的「醫生,當我做這個*時它會受到傷害......」「那麼不要這樣做。」**。 – WhozCraig 2013-03-13 12:21:07
我很想知道我爲什麼要做點什麼,所以如果有人說「嘿,你爲什麼這麼做?」我比「哦,有人告訴我」有更好的迴應。 但是,在日常生活中,不會濫用鏈接器通常是我嘗試和避免的。 – KidneyChris 2013-03-13 12:32:38
你我都。編譯器是開放遊戲,但我試圖尊重鏈接器= P畢竟,它是第九局中更接近的。 – WhozCraig 2013-03-13 12:34:28