因此,有人带着一个项目来找我,该项目链接失败并出现错误 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
or的人产生问题#pragma once
(这导致提供的符号的多个声明)
我在这个网站上发现的一个相关问题也有同样的问题,但答案并没有解释为什么我们在我的理解水平上充分解决了这个问题。
我有问题,我知道解决方案,但我不知道为什么我的解决方案有效