2013-03-07 48 views
1

我想用谷歌测试测试一个函数。链接器错误 - 链接两个“应用程序”类型的项目,以便使用谷歌测试

看来,一切都设置正确,它建立和执行没有gtest罚款...(有一点复杂的代码,所以我不能列出所有的源文件在这里,但没有添加gtest,这些文件链接正确,并按照它们的运行方式运行)。

这是一个应用程序类型项目。它有一些库依赖关系......无关紧要。

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

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

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)" 
([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) 
referenced in function "private: virtual void __thiscall TheTest_Fail_Test::TestBody(void)" 
([email protected][email protected]@EAEXXZ) C:\path\file.obj 

我已经这样做过 - 解决链接错误 - 写了几个测试与谷歌测试 - 但我看不到任何东西丢失。

作为测试,我写了一个小

INT测试(){返回4;}在头文件 ,在类声明...

然后,代替测试与 EXPECT_EQ(x.test(),4);

它工作。大。但这意味着将所有测试过的代码放在一个文件中,一个cpp或其他东西......这简直是不合理的。这个应用程序项目中有几个文件。

我该如何解决这个问题?如何使Google测试链接并使用包含头文件和实现文件的类进行测试?当这个头文件/实现在不同的项目中时,“Application”类型?

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

请帮我找到一个解决方案。

+0

通常你会有一个库(或一些库),它们构成了你自己的代码的大部分,而一个只有'main'函数的exe /应用程序链接你的lib(s)。通过这种方式,您可以使用另一个'main'和一堆测试代码(如果需要的话,可以使用多个文件)来另一个项目,这些代码也*链接您的lib。您不应该期望能够将2个应用程序与2个'main'链接起来。 – Fraser 2013-03-08 09:01:38

+0

谢谢。这就是我最终实现它的原因,只要我完成了问题的提问,确实 - 当我找到我添加的链接时,链接帮助我找出了问题。我不得不创建一个单独的项目,只提取一个小的main()放入它。我确实希望能够将2个应用程序与main()...链接起来,并且花了很长时间才弄清楚我不能。我确定在某处有一个“链接错误手册”,或者“什么可以被测试的手册”,或者“其他人尝试和失败的东西,所以尽量不要犯同样的错误”手册...我想阅读它。 – Thalia 2013-03-08 20:32:51

+0

对 - 我也是!编译器错误通常比链接器更容易解决。 – Fraser 2013-03-08 21:02:10

回答

1

因此,我将有一个答案:

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

1)将相关应用项目2个项目,一个将成为库,大部分代码;另一个将是一个应用程序,包含一个调用真实代码入口点的小型main()(如参数解析方法或其他)。

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

2)不要拆分项目。添加一个gtest项目,不要创建任何依赖项。将要测试的文件添加到gtest项目中。 gtest项目将会是一个独立的可执行文件......它需要所有的快乐。 (优点:不依赖于测试)

我更喜欢第一个版本。

2

有一个又一个解决方案,我更喜欢,因为这意味着你能避免改变你的主要项目:

,主要项目上添加一个“后生成的行动”,以创建一个静态库的确切相同的源文件。 然后,您可以简单地将此依赖项添加到您的gtest项目中。

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

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

希望它有帮助。

+1

具体的设置应该是:打开主项目属性,选择Build Event-> Post-Build Event选项卡。使用命令* lib/NOLOGO /OUT:"$(TargetPath).lib“”$(ProjectDir)\ $(Configuration)\ * .obj“*以便这将生成一个$(ProjectName).exe.lib文件.exe文件,它对于单元测试项目的静态链接很有用。 – yc2986 2016-08-23 22:49:56

0

还有另一种解决方案。

只需为Google测试框架创建一个新项目。 (当然,在您现有的应用程序解决方案下)。

然后,确保您的所有Google测试框架安装正确后。 (您可以在新创建的解决方案中测试它)

手动在您的主项目中包含要测试的代码(使用添加 - >现有项目),然后您可以测试代码而不生成其他库。

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

谷歌测试框架使用一个非常不同的RunTime库(多线程调试(/ MTd)) 。

在链接阶段,编译器会哭,它有一些困难,从应用程序生成的库与多线程DLL和谷歌框架的lib(这是多线程)链接。

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

+0

您的解决方案与我在5年前发布的第二个选项相同。 – Thalia 2017-01-18 17:36:11

+0

嗯....我应该删除我的帖子? – 2017-01-20 01:27:58