C ++ LNK2005'已定义'错误 - 引用自身的文件

时间:2012-08-07 13:55:06

标签: c++ visual-studio-2008 compiler-construction lnk2005

我继承了一个包含3个项目的C ++解决方案,一个编译为.DLL,另外两个编译为.EXE。 DLL构建自己很好,但是另外两个构建时会产生大约65个LNK2005错误,其中大部分都引用相同的.obj文件,如下面的日志所示:


Linking...
Function.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/OPT:ICF' specification
Function.obj : error LNK2005: _ReadLocalRegister already defined in Function.obj
Function.obj : error LNK2005: _getSource already defined in Function.obj
Function.obj : error LNK2005: _SendLogEvent already defined in Function.obj
Function.obj : error LNK2005: _DebugMsg already defined in Function.obj
Function.obj : error LNK2005: _MyInformationMsg already defined in Function.obj
MyNTService.obj : error LNK2005: "public: __thiscall CMyNTService::CMyNTService(void)" (??0CMyNTService@@QAE@XZ) already defined in MyNTService.obj
MyNTService.obj : error LNK2005: "public: virtual void __thiscall CMyNTService::OnStop(void)" (?OnStop@CMyNTService@@UAEXXZ) already defined in MyNTService.obj
MyNTService.obj : error LNK2005: "public: void __thiscall CMyNTService::SaveStatus(void)" (?SaveStatus@CMyNTService@@QAEXXZ) already defined in MyNTService.obj

....所以它继续!

我是一名C#编码员,只有基本的C ++知识,所以我迷失了。解决方案是一个15年前的C解决方案我试图在VS2008中重建为C ++解决方案。我已经设法构建它一次,没有任何改变,但也许从那时起一些配置设置已经改变。

有没有人有我可以开始看的想法??

非常感谢!

2 个答案:

答案 0 :(得分:0)

听起来你在该对象的头文件中缺少包含保护。

添加:

#ifndef SomeUniqueName
#define SomeUniqueName

//Code goes here.

#endif

将代码包装在头文件中。在处理代码时,编译器将多次浏览该头文件,因为它包含在许多地方(最有可能)。包含守卫停止重新定义先前传球中已经定义的东西。

PS:它也可能有助于“干净”。 Makefile可以很好看,特别是如果没有100%正确,有时当依赖关闭时你需要在重建前清理。

答案 1 :(得分:0)

在msvc110(2012)中,我遇到了同样的错误,我发现的唯一解决方法是为我在不同文件中使用的循环函数创建一个类和一个单独的DLL。 这是link这样做的。

干杯