そのため、誰かが、エラーLNK2005:オブジェクトで既に定義されているシンボル(Visual Studio 2010を使用)でリンクに失敗したプロジェクトを持って来ました。この場合、私は何が間違っているかを知っています(したがって、正しい解決策を示すことができます)が、それについての良い説明を与えるために(再発を防ぐために)レベルでこれが間違っている理由はわかりません。
// 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に残すことで修正されます。
リンカーがどのように機能するかについての私の理解は、ここからかなり得られます。私の理解では、私たちは一箇所で必要とされるシンボルを提供しています。
LNK2005に関するMSDNの記事を調べました。これは、リンカーの動作を期待する方法と一致します(シンボルを複数回提供する->リンカーが混乱している)が、このケースをカバーしていないようです(つまり、明らかなことを理解していないことを意味します)リンクについて)。
GoogleとStackOverflowは、#ifndef
またはを含まない人々に問題を#pragma once
引き起こします(これは提供されたシンボルの複数の宣言につながります)
このサイトで見つけた関連する質問にも同じ問題がありますが、その答えは、なぜこの問題が私の理解レベルに十分に達しているのかを説明していません。
問題があり、解決策はわかっていますが、解決策が機能する理由がわかりません