【问题标题】:Unresolved externals when compiling unit tests for Visual C++ 2012为 Visual C++ 2012 编译单元测试时未解决的外部问题
【发布时间】:2012-12-23 11:34:48
【问题描述】:

我想为 Visual C++ 项目创建单元测试。我尝试关注these MSDN instructions。我找到了区分非托管/混合/纯代码的页面,但我并不完全理解这些概念。我的代码不使用 .NET,可能会在 MinGW 下通过一些代码调整进行编译。

我的主项目构建了一个可执行文件,因此我按照从测试项目中引用导出的函数中的步骤进行操作。对于初学者,我有不同的项目选择:

我选择了 Native Unit Test Project。我添加了对我的主项目的引用,并将 Include Directories 设置为 $(SolutionDir)\Cubes;$(IncludePath)。我编写了我的代码并在编译时得到了这个:

1>Creating library C:\Users\Pieter\Dropbox\Unief\TTUI\TTUIproject\Cubes\Debug\CubesTest.lib and object C:\Users\Pieter\Dropbox\Unief\TTUI\TTUIproject\Cubes\Debug\CubesTest.exp
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: __thiscall Room::Room(void)" (??0Room@@QAE@XZ) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" (?NumOfRoomsConsistency@LayoutTest@CubesTest@@QAEXXZ)
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: __thiscall Layout::Layout(class Room *,int)" (??0Layout@@QAE@PAVRoom@@H@Z) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" (?NumOfRoomsConsistency@LayoutTest@CubesTest@@QAEXXZ)
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: void __thiscall Layout::add(int,int,class Room *)" (?add@Layout@@QAEXHHPAVRoom@@@Z) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" (?NumOfRoomsConsistency@LayoutTest@CubesTest@@QAEXXZ)
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: void __thiscall Layout::clear(int,int,bool)" (?clear@Layout@@QAEXHH_N@Z) referenced in function __catch$?NumOfRoomsConsistency@LayoutTest@CubesTest@@QAEXXZ$0
1>C:\Users\Pieter\Dropbox\Unief\TTUI\TTUIproject\Cubes\Debug\CubesTest.dll : fatal error LNK1120: 4 unresolved externals

如果我没记错的话,这意味着编译器会找到头文件,而不是源文件。我错过了什么?

【问题讨论】:

  • 不,这意味着 linker 找不到包含您引用的符号的二进制文件。
  • 对,我如何告诉链接器在哪里可以找到所需的文件?我已经尝试过this,但没有成功。
  • 这应该可以解决问题。还要确保你真的编译所有包含你的文件的项目(检查依赖关系)
  • 遗憾的是,即使在按顺序清理和重建两个项目之后,我仍然会遇到错误。我还尝试改用$(SolutionDir)\Cubes\Debug,它似乎存储了.obj 文件。我来自MinGW背景,所以我习惯将源代码编译为.o文件。
  • 检查链接器->输入->附加依赖。手动添加您的.lib 文件

标签: unit-testing visual-c++ visual-studio-2012


【解决方案1】:

这是关于如何将 EXE 添加为单元测试目标的分步说明。

关键是“导出”你想要测试的函数/类...你可以在这里下载完整的示例:http://blog.kalmbachnet.de/files/CPP_UnitTestApp.zip(我没有更改任何项目设置,所以你可以在源代码,当然有些部分可以在工程设置中制作)。

  1. 创建一个 Win32 应用程序(控制台或 MFC 或 Windows,无关紧要);我创建了一个名为 CPP_UnitTestApp 的控制台项目:

  2. 添加一个你想测试的函数(你也可以添加类)。例如:

    int Plus1(int i)
    {
      return i+1;
    }
    
  3. 为要测试的函数添加头文件:CPP_UnitTestApp.h

  4. 将方法的声明放入头文件,同时导出这些函数!

    #pragma once
    
    #ifdef EXPORT_TEST_FUNCTIONS
    
    #define MY_CPP_UNITTESTAPP_EXPORT __declspec(dllexport)
    #else
    #define MY_CPP_UNITTESTAPP_EXPORT
    #endif
    
    MY_CPP_UNITTESTAPP_EXPORT int Plus1(int i);
    
  5. 在 main-cpp 中包含这个头文件(这里是 CPP_UnitTestApp.cpp)并在包含头之前定义EXPORT_TEST_FUNCTIONS

    #define EXPORT_TEST_FUNCTIONS
    #include "CPP_UnitTestApp.h"
    
  6. 现在添加一个新项目(本机单元测试项目:UnitTest1)

  7. 在“unittest1.cpp”文件中包含头文件和库(根据需要采用路径):

    #include "..\CPP_UnitTestApp.h"
    #pragma comment(lib, "../Debug/CPP_UnitTestApp.lib")
    
  8. 转到测试项目的项目设置添加对“UnitTest1”项目的引用(项目|属性|通用属性|添加新引用...:在“项目”下选择“CPP_UnitTestApp”-项目)

  9. 创建单元测试函数:

    TEST_METHOD(TestMethod1)
    {
      int res = Plus1(12);
      Assert::AreEqual(13, res);
    }
    
  10. 运行您的单元测试;)

如您所见,重点是导出函数声明!这是通过__declspec(dllexport) 完成的,即使它是一个EXE。

正如我所说,演示项目可以在这里下载:http://blog.kalmbachnet.de/files/CPP_UnitTestApp.zip

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2014-01-03
    • 2013-01-16
    • 2014-09-07
    • 2016-07-18
    相关资源
    最近更新 更多