C++ 包含标头如何导致链接器错误?

C++ 包含标头如何导致链接器错误?,c++,visual-studio-2012,linker,C++,Visual Studio 2012,Linker,我有两个完全不相关的cpp文件,我们称它们为simplify.cpp和migrate.cpp,还有一个来自另一个库的头文件server.h 当我尝试将server.h包含到simplify.cpp中时,在两个cpp文件中都会出现链接器错误LNK2001未解析的外部符号 我已经检查过它所指的符号确实是在库中定义的,甚至在其他地方也使用过。它的作用是: SomeObject::SetValue( const std::shared_ptr<Value>& value ) Som

我有两个完全不相关的cpp文件,我们称它们为
simplify.cpp
migrate.cpp
,还有一个来自另一个库的头文件
server.h

当我尝试将
server.h
包含到
simplify.cpp
中时,在两个cpp文件中都会出现链接器错误LNK2001未解析的外部符号

我已经检查过它所指的符号确实是在库中定义的,甚至在其他地方也使用过。它的作用是:

SomeObject::SetValue( const std::shared_ptr<Value>& value )
SomeObject::SetValue(const std::shared_ptr&value)
它重写不执行任何操作的基类实现

我甚至不确定这些是否相关,但还有更多信息:基类实现是在其头文件中定义的(只是空括号),而
SomeObject
的实现是在其cpp文件中定义的。继承相当深入,涉及一些模板,但这从来都不是问题

有人知道这可能是什么原因吗?为什么它会导致另一个文件中的链接错误,而我甚至都没有碰它


我使用的是VS2012。

出现链接器错误的原因是因为您的头文件指出

函数
SomeObject::SetValue(const std::shared\u ptr&value)
在某处存在


但是链接器找不到此函数的定义。如果它确实是在您使用的同一个库中定义的,请检查定义中所有内容的语法。这可能是因为打字错误。

问题标题的答案很简单:包括标题可以引入新符号。如果链接器找不到这些符号(例如,因为您忘记链接库),则会出现链接器错误。更有趣的问题是,为什么在两个文件中都会出现这种错误,我不知道。也许链接器出于某种原因丢失了符号的来源?仅仅因为您对某个头文件使用了#include指令并不意味着它将如您所期望的那样工作。如果您使用#include,*.h文件是您在解决方案目录中为自己的项目创建的文件,则此功能将起作用。当您开始包含外部标题或3d party库时,不仅需要使用#include指令,还必须告诉visual studio*.h文件的位置以及与该库相关的任何依赖项,如任何*.lib或*.dll文件。(…续)如果不知道,visual studio无法解析任何符号,在*.h文件中定义的类或函数。*.h文件只是声明,其中.cpp文件是定义-实现。您需要进入项目的设置-属性,并将链接器设置为针对任何需要的库进行链接,并指向这些目录所在的位置。我想您应该显示实际的代码和错误消息,否则这个问题可能不会引出任何问题。几个潜在的指导性问题:库是DLL还是静态库?(如果是DLL,则外部使用的函数/类必须是dllexported)调用SomeObject::SetValue的“其他位置”是什么?它与simplify.cpp在同一个库中吗?您也可以尝试在这里发布一个/详细的链接器输出,我们将尝试帮助您分析它。我知道至少有一个VC++的“设计缺陷”在过去()给我造成了类似的行为。我唯一的问题是:我包含了转发声明未使用函数的头,我没有收到链接器错误,尽管我使用的是gcc/clang/sunstudio,而不是visual studio。事实上,除非你使用odr这样的函数,它们不需要定义。这个答案基本上是错误的。从他的问题中,我似乎暗示这个函数并没有被使用。我认为说这个答案是“错误”有点牵强,因为我没有说清楚。但是,是的,我想应该在我的回答中明确说明这一点。