Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用_“已定义主节点”;在使用gtest时_C++_Visual Studio_Googletest - Fatal编程技术网

C++ &引用_“已定义主节点”;在使用gtest时

C++ &引用_“已定义主节点”;在使用gtest时,c++,visual-studio,googletest,C++,Visual Studio,Googletest,我有一个包含两个项目的解决方案 其中一个是控制台应用程序,另一个是Google测试项目 我的项目有一个.h文件和一个.CPP文件,其中有一个main() 我的gtest由一个.CPP文件和一个主函数组成,该文件使用#include调用.h文件以运行#ALL_TESTS() 我的项目中需要一个main,但gtest项目中也需要一个main,但是有两个main()不能让我成功构建gtest 有解决办法吗? 抱歉,如果这是一个愚蠢的问题,我不知道如何使用gtest,因为不同的网站不断以不同的方式呈现g

我有一个包含两个项目的解决方案

其中一个是控制台应用程序,另一个是Google测试项目

我的项目有一个.h文件和一个.CPP文件,其中有一个main()

我的gtest由一个.CPP文件和一个主函数组成,该文件使用#include调用.h文件以运行#ALL_TESTS()

我的项目中需要一个main,但gtest项目中也需要一个main,但是有两个main()不能让我成功构建gtest

有解决办法吗?
抱歉,如果这是一个愚蠢的问题,我不知道如何使用gtest,因为不同的网站不断以不同的方式呈现gtest的标准用法是用于单元测试。 通常,单元测试不检查main:)

我建议您使用标准gtest主函数(不要定义自定义主函数)。它允许您使用命令行筛选正在运行的测试


如果您不想使用gtest main,IMHO,您不应该包括gtest_main库。

首先,您应该为
main()
函数提供一个专用文件
main.cpp
,该文件不包含任何其他内容

例如,您的项目结构可能如下所示:

  • 项目1
    • file1.h
    • file1.cpp
    • main.cpp
我对gtest不太熟悉,但通常单元测试框架有一个单独的文件用于gtest主功能,例如
gtest\u main.cpp
。测试在一个或多个文件中,如
file1test.cpp

因此,您可以编译项目1并将其与
file1.h
file1.cpp
main.cpp
链接,以获得可执行文件

对于单元测试,您将编译并链接单元测试可执行文件的
file1.h
file1.cpp
file1test.cpp
gtest\u main.cpp

结构可以是

  • 项目1
    • file1.h
    • file1.cpp
    • main.cpp
  • 项目1测试
    • file1test.cpp
    • gtest_main.cpp
编辑有关链接的其他信息:

在project1test中,您可以将
file1.h
#include./project1/file1.h
一起包含

要正确链接,请右键单击
project1test
project

-->配置属性-->链接器-->输入-->其他依赖项-->添加“.\project1\Debug\file1.obj”

正如@Alan Birtles所指出的,如果你有以下结构,它会更加清晰:

  • 项目1图书馆
    • file1.h
    • file1.cpp
  • 项目1应用程序
    • main.cpp
  • 项目1测试
    • file1test.cpp
    • gtest_main.cpp
您将获得一个静态/动态库
project1library.lib/.dll
、一个可执行的
project1application.exe
和一个单元测试可执行文件
project1test.exe

优点是您只需将单元测试项目中的库与

-->配置属性-->链接器-->输入-->其他依赖项-->添加“.\project1library\Debug\project1library.lib”

如果项目中需要多个文件,则不必添加每个obj文件,只需添加一个lib文件


但是,对于lib、可执行文件和单元测试项目,确保在更改时正确地重建所有内容可能更困难,也更容易出错。

我使用宏来解决这个问题。我定义了一个测试宏,它在编译单元测试时计算为true,否则计算为false:

#ifndef TESTING
// the source main
int main() {
    ...
}
#endif // !TESTING
稍后您还可以将其用于源代码中的“测试”代码。我有时会做什么(在我看来不是很好的设计):


我没有手动包含任何库,我使用的是VS2017,Google Test作为一个包提供。如果我没有编写一个包含RUN_ALL_TESTS()的main(),那么测试资源管理器将无法找到我的测试。不要认为这会起作用,将project1链接到project1test将导致main的两个定义,您需要3个项目,一个用于库,一个用于测试,另一个用于包含main的应用程序如果您只链接file1.cpp而不是main.cpp,它将工作。但是,您是对的,库、应用程序和测试的不同目录/项目提供了更清晰的分离,但也使其更加复杂。对于新手问题,很抱歉,但是如何在Visual Studio 2017中将gtest_main.cpp与file1.h和file1.cpp链接?它们属于不同的项目。谢谢。我没有想到将main.cpp与项目的其余部分分开。我使用file1.h、file1.cpp和main.cpp创建了一个.lib,这说明了为什么它不起作用。最后一个疑问,这是C++单元测试完成的标准方式(从其他文件中分离主文件),或者有其他合适的方法吗?
class Klass:

#ifdef TESTING
    friend class KlassUnitTestClass; // allows access to private members in my google test unit class. Disabled when i build sources
#endif // !TESTING