0

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

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

为简单起见,假设我的解决方案中只有 2 个项目。一个库项目(它创建一个 .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

Verbose.cpp用于调试目的。它包装了 ostream,所以我没有使用cout <<,而是使用verbose <<. 这样做是为了控制何时向控制台显示详细输出。在我的版本变体中,所有详细输出都被跳过。

我在两个项目中都有一个副本的原因Verbose.cpp是我可以在我的 ExecProj 中获得详细的输出,而无需在调试中构建 LibProj。

Driver.hppClient.cpp使用verbose <<. MyMainFile.cpp调用它们中的函数。

不用说,使用正常的构建方式,一切正常。

现在问题...

Unity.cpp在 LibProj 中创建。它的内容是:

#include "Client.cpp"
#include "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 文件中已经存在的详细函数。

我的问题是,为什么单独编译文件时它可以工作,但它不适用于统一构建?

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

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

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

4

1 回答 1

0

我想我知道发生了什么。

Unity.cpp 包含 Verbose.cpp 和 Client.cpp
-Verbose.cpp 具有print的实现。
-Client.cpp 包括 Verbose.hpp ,它引入了print的实现。
所以 Unity.obj 有 2 个print的实现。

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

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

为了测试这个理论,我创建了 2 个 Unity 文件。
Unity.cpp 包括 Verbose.cpp
Unity2.cpp 包括 Client.cpp

通过这个实现,我可以构建。这是因为 LibProj.lib 现在有两个.obj 文件(Unity.obj 和 Unity2.obj),每个文件都包含一个print的实现,所以没有符号冲突。

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

谢谢。

于 2013-01-04T00:54:49.053 回答