c++ - 将单元测试添加到遗留解决方案时出现链接错误

标签 c++ visual-c++ visual-studio-2017 googletest boost-test

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

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

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

但是当我尝试测试 exe 项目中的代码时,我收到了 exe 项目中定义的代码的 LNK2019“未解析的外部符号”链接器错误。包含目录设置正确,测试项目引用了相关的其他项目。我很茫然。

经过一些在线搜索和修改新设置的测试解决方案后,我确定了两个可能的原因:

  • 无法在生成 exe 文件的项目中测试代码
  • 无法测试使用 __stdcall 编译的项目中的代码

我的链接器错误可能是由此引起的吗?如果是这样,我该如何解决错误?

最佳答案

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

我只能提出以下建议:将可执行项目转换为库项目(无论它是 .dll 还是静态库)并将 main() 中的(希望)一小段代码移动到另一个将(现在是库)项目链接到可执行文件中的项目。如果您的 main() 有很多代码,您可以考虑将它变成一个静态函数,然后从"new"可执行项目中的"new"main() 调用该静态函数(从而启动您的应用程序)。

然后您可以像任何其他“库”项目一样测试您的项目,并且没有相关代码可以在您的基本可执行项目中进行测试。

关于c++ - 将单元测试添加到遗留解决方案时出现链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50467683/

相关文章:

c++ - std :map and std:set 的线程安全

visual-studio-2017 - VS2017 NuGet : Dependencies not install automatically

asp.net-core - 当我在浏览器中刷新页面时,如何在 ASP.NET Core 2.2 中启用自动重建?

c++ - 如何在 native C++ 中获取进程名称和日期时间戳

database - 连接超时已过期... [登录前] 初始化=211;握手=14787;

c++ - 正确使用工厂类的标准 move

c++ - 常量引用包装器

c++ - libstdc++ 中允许不兼容的函数类型?

c++ - 构造函数名称前的关键字 struct

visual-c++ - 为什么在 C++ 类定义中使用 public ref