C++ 将单元测试添加到旧解决方案时出现链接错误

C++ 将单元测试添加到旧解决方案时出现链接错误,c++,visual-c++,visual-studio-2017,googletest,boost-test,C++,Visual C++,Visual Studio 2017,Googletest,Boost Test,我目前正在为我们的开发团队评估单元测试框架,遇到了一个我不知道如何解决的问题 我们的应用程序是使用Visual Studio 2017构建的。该解决方案包含17个项目。其中大多数是由另一个团队开发的(从我们的观点来看,基本上是第三方库),大多数项目都会生成一个dll文件。一个项目被配置为构建可执行文件 我似乎无法测试的就是那个exe项目。我试过Boost::Test和Google.Test。当我尝试使用在某个dll项目中定义的类编写测试时,它会按预期工作 但是,当我尝试测试exe项目中的代码时,

我目前正在为我们的开发团队评估单元测试框架,遇到了一个我不知道如何解决的问题

我们的应用程序是使用Visual Studio 2017构建的。该解决方案包含17个项目。其中大多数是由另一个团队开发的(从我们的观点来看,基本上是第三方库),大多数项目都会生成一个dll文件。一个项目被配置为构建可执行文件

我似乎无法测试的就是那个exe项目。我试过Boost::Test和Google.Test。当我尝试使用在某个dll项目中定义的类编写测试时,它会按预期工作

但是,当我尝试测试exe项目中的代码时,我得到了exe项目中定义的代码的LNK2019“未解析的外部符号”链接器错误。如果正确设置了include目录,测试项目将引用相关的其他项目。我不知所措

在一些在线搜索和修补新设置的测试解决方案后,我发现了两个可能的原因:

  • 无法在生成exe文件的项目中测试代码
  • 无法在使用u stdcall编译的项目中测试代码
我的链接器错误可能是由此引起的吗?如果是这样,我如何解决错误?

您不能(直接)对生成可执行文件的项目进行单元测试。单元测试框架需要创建一个可执行文件来运行(和评估)单元测试,因此您将在项目中得到两个main()

我只能提出以下建议:将可执行项目转换为库项目(无论是.dll还是静态库),并将main()中的一小段代码(希望是)移动到另一个项目,该项目将(现在的库)项目链接到可执行文件中。如果您的主体()有大量代码,您可以考虑将其转换为静态函数,然后从“新建”可执行项目中的“新”主体()中调用静态函数(从而启动应用程序)。
然后,您可以像任何其他“库”项目一样测试您的项目,并且在您的基本可执行项目中没有要测试的相关代码。

通常,测试框架实用程序(可执行文件)将加载您的代码、执行测试并报告结果。一个可执行文件不能加载另一个可执行文件并运行其代码-测试中的代码必须在dll中才能工作。是的,但当测试可执行文件生成时,是否可以从目标文件链接到测试中的代码?@PixelSupreme是的,这是可能的-但这是非常黑客行为。您需要明确地链接到每个对象文件,否则会出现链接器错误(就像您现在所做的那样)。通过采用适当的长期解决方案,例如将.exe项目转变为一个库,将该库作为正常情况进行卸载测试,并创建一个新的可执行项目,作为一个瘦包装,基本上调用库中的旧“main”,您的服务会更好