C++ LNK2005“已定义”错误 - 文件引用自身

问题描述 投票:0回答:2

我继承了一个包含 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++ 解决方案。我已经成功构建了一次,没有任何改变,但也许从那时起一些配置设置已经改变了。

有人知道我可以从哪里开始寻找......吗?

c++ visual-studio-2008 lnk2005
2个回答
0
投票

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

添加:

#ifndef SomeUniqueName
#define SomeUniqueName

//Code goes here.

#endif

将代码包装在头文件中。 编译器在处理代码时会多次遍历该头文件,因为它包含在很多地方(很可能)。 包含守卫会停止重新定义在之前的传递中已经定义的事物。

PS:“清理干净”也可能有所帮助。 Makefile 可能会很挑剔,尤其是如果没有 100% 正确的话,有时当依赖关系关闭时,您需要在重建之前进行清理。


0
投票

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

干杯

© www.soinside.com 2019 - 2024. All rights reserved.