链接器错误 - 链接两个“应用程序”类型项目以使用Google Test

时间:2013-03-07 23:13:27

标签: c++ linker-errors googletest

我正在尝试使用Google Test测试功能。

似乎一切都设置正确,并且它构建并执行正常而没有gtest ......(代码中有一点复杂,所以我不能在这里列出所有的源文件,但是没有添加gtest,文件正确链接,并按照应有的方式运行。

这是一个应用程序类型项目。它有许多库依赖...不相关。

测试项目作为单独的项目添加到解决方案中。它将测试项目作为依赖项。测试项目的.h文件只指向gtest ... .cpp(不是main,这是标准的InitGoogleTest main)添加了自己的头文件,测试项目的头文件,并且测试如下所示

当项目构建时,即使它是一个应用程序,也会自动创建一个TestedProject.lib。我已将TestedProject.lib作为库依赖项添加到TestProject(在链接中)。

Class x
{
public:
  x(){}    // I didn't really need this, I only added the class so I have access to 
  ~x(){};  // non-class methods with gtest - but it still doesn't work
  bool myFunction(std::string a, double b, bool c);  
};

实现:

bool x::myFunction(std::string a, double b, bool c)
{
  // implementation
  return false;
}

somewhere_else
{
  x x_instance;
  y = x_instance.myFunction("a", 1, false);   // works, all builds, executes, life is great
}

添加单元测试:

class TheTest : public ::testing::Test
{
protected:
    x x_instance;
};

TEST_F(TheTest, Fail)
{
    EXPECT_FALSE(x_instance.myFunction("a", 1, false));     
}

不构建。链接错误(修改后,如上面的示例代码,简化名称,我希望我没有搞乱内容)

Error   2   error LNK2019: unresolved external symbol 
"public: bool __thiscall x::myFunction(class std::basic_string<char,struct std::char_traits<char>,double,bool)" 
(?myFunction@x@@QAE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00000NNNN_N1@Z) 
referenced in function "private: virtual void __thiscall TheTest_Fail_Test::TestBody(void)" 
(?TestBody@TheTest_Fail_Test@@EAEXXZ)   C:\path\file.obj

之前我已经完成了这个 - 解决了链接错误 - 用Google测试写了几个测试 - 但我看不到任何遗漏。

作为测试,我写了一点

int test(){return 4;} 在头文件中,在类声明中......

然后,用。替换测试 EXPECT_EQ(x.test(),4);

有效。大。但这意味着将所有经过测试的代码放在一个文件中,一个cpp或者其他东西......这简直是不合理的。此Application项目中有一些文件。

如何解决此问题?如何使用带有标题和实现文件的类进行Google Test链接和测试?当该标题/实现位于不同的项目中时,“应用程序”类型是什么?

到目前为止我发现的唯一类似问题:C++ linking issue on Visual Studio 2008 when crosslinking different projects on same solution

请帮我找一个解决方案。

3 个答案:

答案 0 :(得分:2)

还有另一个解决方案,我更喜欢,因为这意味着您可以避免更改主项目:

向主项目添加“post build action”,以便为完全相同的源文件创建静态库。 然后你可以简单地将这个依赖项添加到你的gtest项目。

每次编译主项目时,它都会构建应用程序和静态库。

这样您就不必创建第三个项目并保持配置同步。

希望它有所帮助。

答案 1 :(得分:1)

所以我会得到答案:

我的问题有2个解决方案:

1)在2个项目中分解应用程序项目,一个将成为一个库,包含大部分代码;另一个是一个应用程序,包含一个微小的main(),它调用实际代码的入口点(比如参数解析方法或其他东西)。

然后,我可以添加一个单元测试项目 - 来测试lib。

2)不要破坏项目。添加gtest项目,不要创建任何依赖项。将文件添加到gtest项目中进行测试。 gtest项目将是一个单独的可执行文件......所有它都需要快乐。 (优点:没有测试依赖性)

我更喜欢第一个版本。

答案 2 :(得分:0)

还有另一种解决办法。

只需为Google Test Framework创建一个新项目。 (当然,根据您现有的应用程序解决方案)。

然后,确保所有Google Test Framework设置正确无误后。 (您可以在新创建的解决方案下测试它)

从主项目中手动包含您想要测试的代码(使用Add - &gt; Existing Item),然后您可以测试代码而无需生成额外的lib。

这很好的部分是当你从windows测试一些需要DLL的应用程序时,它需要应用程序使用多线程调试DLL。 (在你的项目属性设置中,转到C / C ++ - &gt;代码生成 - &gt;运行时库,看看你得到了什么)

Google Test Framework使用了一个非常不同的RunTime库(多线程调试(/ MTd))。

在链接阶段,编译器会因为使用Multi-Thread DLL和google framework的lib(多线程)将应用程序生成的lib链接起来有些困难。

通过这种方式,您可以避免两个项目的依赖性问题。 (一个用于/ Mtd,一个用于/ Md)