C++ C++;统一构建图书馆文件,LNK2005

C++ C++;统一构建图书馆文件,LNK2005,c++,build,lnk2005,C++,Build,Lnk2005,我是新来的统一建设。我一直在做一些研究,我从以下方面获得了很好的信息: 然而,现在我开始对我的一些项目进行更改,我有点困惑 为了简单起见,假设我的解决方案中只有两个项目。一个库项目(它创建一个.lib文件)和一个可执行项目。我们叫他们LibProj和ExecProj 以下是每个项目的外观: LibProj >include >>Client.hpp<br> >>Driver.hpp<br> >>Verbose.hpp &

我是新来的统一建设。我一直在做一些研究,我从以下方面获得了很好的信息:

然而,现在我开始对我的一些项目进行更改,我有点困惑

为了简单起见,假设我的解决方案中只有两个项目。一个库项目(它创建一个.lib文件)和一个可执行项目。我们叫他们LibProj和ExecProj

以下是每个项目的外观:

LibProj
>include
>>Client.hpp<br>
>>Driver.hpp<br>
>>Verbose.hpp

>source
>>Client.cpp<br>
>>Verbose.cpp

ExecProj
>source
>>MyMainFile.cpp<br>
  Verbose.cpp
LibProj构建得很好。但是,当我构建ExecProj时,它会在链接过程中中断:

LibProj.lib(Unity.obj) : error LNK2005: "public: void __thiscall VerboseMonitor::print(char const *,int)"
(?print@VerboseMonitor@@QAEXPBDH@Z) already defined in Verbose.obj
LibProj.lib(Unity.obj) : error LNK2005: "public: __thiscall VerboseStream::VerboseStream(void)" 
(??0VerboseStream@@QAE@XZ) already defined in Verbose.obj
C:\Users\\...\ExecProj.exe : fatal error
LNK1169: one or more multiply defined symbols found
基本上,它会抱怨,因为我们正在重新定义lib文件中已经存在的详细函数

我的问题是,为什么在单独编译文件时它可以工作,而在unity build中却不能工作

是什么使一个.lib文件与另一个不同?我的意思是,从技术上讲,
LibProj.lib
在两种构建情况下都有
VerboseMonitor::print
的符号,这些符号由ExecProj重新定义。然而,unity build案例失败了

解决此问题的一种方法是创建另一个仅包含Verbose.cpp的lib文件,并将其从两个项目中删除。然而,我想了解为什么会先发生这种情况


还有,有人能想出更好的方法来解决这个问题吗?

我想我知道发生了什么

Unity.cpp包含Verbose.cpp和Client.cpp
-Verbose.cpp具有打印功能。
-Client.cpp包括Verbose.hpp,它引入了打印的实现。
因此Unity.obj有两种打印实现

这意味着库(LibProj.lib)包含一个带有打印副本的文件。因此,当我们尝试链接到库时,编译器不知道使用哪种打印

这在常规构建中起作用的原因是,通常情况下,Verbose.cpp创建Verbose.obj,其中包含打印的实现,Client.cpp创建Client.obj,其中也包含打印的实现。这意味着库(LibProj.lib)包含两个.obj文件,每个文件中都定义了print,因此编译器会选择一个(不过我不知道如何选择)

为了验证这个理论,我创建了两个Unity文件。
Unity.cpp包括Verbose.cpp
Unity2.cpp包括Client.cpp

有了这个实现,我能够构建。这是因为LibProj.lib现在有两个.obj文件(Unity.obj和Unity2.obj),每个文件都包含一个打印实现,因此没有符号冲突

这只是一个有根据的猜测,我保留犯错的权利:)。但是,如果我错了,请纠正我


谢谢。

欢迎来到unity builds的乐趣。您想这样做有什么特别的原因吗?构建时间需要一个多小时。实际上,我的解决方案有150多个项目,LibProj有近1000个文件。我正在寻找加快构建时间的方法。请不要误用单元标记,因为这是针对Microsoft Unity的。是时候做一个新标签了。
LibProj.lib(Unity.obj) : error LNK2005: "public: void __thiscall VerboseMonitor::print(char const *,int)"
(?print@VerboseMonitor@@QAEXPBDH@Z) already defined in Verbose.obj
LibProj.lib(Unity.obj) : error LNK2005: "public: __thiscall VerboseStream::VerboseStream(void)" 
(??0VerboseStream@@QAE@XZ) already defined in Verbose.obj
C:\Users\\...\ExecProj.exe : fatal error
LNK1169: one or more multiply defined symbols found