【问题标题】:C++ Unit Test Native C++C++ 单元测试本机 C++
【发布时间】:2015-07-30 13:07:56
【问题描述】:

首先,一点背景:

在工作中,我继承了一个大型 C++ 程序(一种我 12 年来没有广泛使用过的语言)。为了帮助自己更好地理解应用程序以及它如何组合在一起,我想,“我喜欢 TDD,为什么不写一些单元测试!”。从那以后,我花了两天时间来编译一个简单的单元测试。我正处于连接器的位置,但出现以下错误:

CIniReader* reader = new CIniReader("");


Error   3   error LNK2019: unresolved external symbol "public: __thiscall CIniReader::CIniReader(char *)" (??0CIniReader@@$$FQAE@PAD@Z) referenced in function "public: void __clrcall ApogeeTests::UnitTest1::TestMethod1(void)" (?TestMethod1@UnitTest1@ApogeeTests@@$$FQ$AAMXXZ) C:\Users\champad\Documents\Applications\Leading Hedge\src\Apogee.Tests\UnitTest1.obj    Apogee.Tests

现在,我可以解决这个问题,将它所在的项目设置为静态库,而不是 DLL 项目(属性 -> 配置属性 -> 常规 -> 配置类型)。

我的问题是:我必须这样做吗?似乎必须有一种方法让链接器在编译时识别它需要的功能,而不必在我想要进行单元测试时不断地将所有 24 个项目切换到 lib,并在我需要部署它时返回。

有什么想法吗?

【问题讨论】:

  • 这可能是由于您的单元测试应用程序链接到运行时库的方式如何查看属性->C/C++->代码生成->运行时库。两者(您的单元测试应用程序和它使用的库)都应该具有相同类型的运行时库。
  • 项目被设置为多线程DLL,所以我把测试项目改成同样的,但是没有解决问题。
  • 您是否在您的单元测试应用程序的链接器输入中指定了库?
  • 我在公共属性下添加了对它的引用,并将其设置为链接库依赖并使用库依赖输入。没有解决链接器错误。
  • 您提到您的解决方案中有很多项目您是否引用了所有需要编译的项目?有时库依赖于需要明确链接到您的应用的其他库。

标签: c++ visual-studio-2010 unit-testing tdd


【解决方案1】:

虽然不是我想要的,但这就是我正在做的事情,除非有人有更好的建议!

我添加了一个新的项目配置并将其命名为 UnitTesting。在该配置下,所有 C++ 项目都是单元测试项目可以引用的静态库。我想我在部署之前更改了配置,所以这对我来说很容易记住。

虽然不理想,但这是可行的。但是如果有更好的方法,请告诉我!

【讨论】:

    【解决方案2】:

    Visual Studio 为您创建的每个 DLL 创建一个静态库,专门用于与客户端代码链接。

    如果您的项目有以下模块:

    core-functionality.dll
    unit-tests.exe
    

    然后您的 unit-tests.exe 将使用 LoadLibrary 和系列从 core-functionality.dll 加载 API,并将生成的函数指针转换为正确的类型(这很丑陋、容易出错且难以维护),或者它可以静态链接,针对 core-functionality。lib(这应该在 core-functionality.dll 的构建过程中生成)。

    我认为您正在寻找第二种选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多