当前位置: 首页 > 知识库问答 >
问题:

使用gtest时_main已定义"

公孙威
2023-03-14

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

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

我的项目有一个 .h 文件和一个 .带有主 () 的 CPP

我的gtest包含一个. CPP文件,它调用。使用#include和一个main函数来运行_ALL_TESTS()

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

有解决方法吗?抱歉,如果这是一个愚蠢的问题,我不知道如何使用gtest,因为不同的网站一直以不同的方式呈现。

共有3个答案

公冶谦
2023-03-14

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

#ifndef TESTING
// the source main
int main() {
    ...
}
#endif // !TESTING

您也可以稍后将其用于源代码中的“测试”代码。我有时会做什么(不是好的设计IMO):

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
郎慎之
2023-03-14

gtest的标准用法是用于单元测试。通常,单元测试不检查main:)。

我建议你使用标准gest主函数(不要定义自定义主函数)。它允许您使用命令行来过滤正在运行的测试。

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

晏卓君
2023-03-14

首先,您应该为< code>main()函数创建一个专用文件< code>main.cpp,其中不包含任何其他内容。

E、 g.您的项目结构可能如下所示:

  • 项目1
    • 文件1.h
    • 文件1.cpp
    • 主要.cpp

    我不太熟悉gtest,但是通常单元测试框架有一个单独的文件用于gtest main函数,例如< code>gtest_main.cpp。测试位于一个或多个文件中,如< code>file1test.cpp等。

    因此,您将编译并链接您的项目1与file1. hfile1.cppmain.cpp以获取可执行文件。

    对于单元测试,您将编译和链接file1. hfile1.cppfile1test.cppgtest_main.cpp用于单元测试可执行文件。

    结构可以像

    • 项目1
      • 文件1.h
      • 文件1.cpp
      • 主要.cpp
      • file1test.cpp
      • gtest_main.cpp

      编辑有关链接的其他信息:

      在项目 1 测试中,您将包含文件 1.h,#include “../项目 1/文件 1.h“

      要正确链接,请右键单击项目1测试项目

      --

      正如@Alan伯特尔斯所指出的,如果你有以下结构,它会更清晰:

      • 项目1库
        • 文件1. h
        • file1.cpp
        • 主要.cpp
        • file1test.cpp
        • gtest_main.cpp

        您将获得一个静态/动态project1library.lib/.dll、一个可执行项目1 应用程序.exe和一个单元测试可执行项目1test.exe

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

        --

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

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

 类似资料:
  • 问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 7年前关闭。 使用on 编译时,出现错误 为什么编译器将as视为而不是整数?我们什么时候使用? 编辑 :好的,我有点理解答案,但是您可以从“ arch / arm / include / asm / p

  • 使用定时设定机能 设定RSS频道的定时巡逻时刻。能于设定的时刻,自动与网络联机,并下载已登录之频道的内容(项目)。 设定时刻 1. 选择频道后按下按钮,再选择选项选单的[定时设定]。 2. 设定要启动的时刻。 结束设定后,按下方向按钮,前往下一个画面。 3. 选择频道。 选择定时设定启动时要巡逻的频道。亦可进入选项选单选择[全选]。 结束设定后,按下方向按钮,前往下一个画面。 4. 保存设定。 按

  • 我正在尝试将套接字绑定到以下端口: 但它给出: 为什么会出现这个错误呢?

  • 问题内容: 我正在尝试将套接字绑定到以下端口: 但是它给出: 为什么会发生此错误? 问题答案: 该错误通常表示您尝试打开的端口已被另一个应用程序使用。尝试使用netstat查看哪些端口已打开,然后使用可用端口。 还检查您是否绑定到正确的IP地址(我假设它是本地主机)

  • 我正在使用Dropwizard JDBI框架开发一个Web服务。 现在,我想使用“用户指定的参数”,而不是在yaml文件中具有数据库配置,我的意思是,数据库配置将通过endpointURL提供。 通过dropwizard jdbi可以定制信用吗 如果是,在引用此内容时,我应该考虑在代码中进行哪些更改?- http://dropwizard.readthedocs.org/en/latest/man

  • 问题内容: 我有一个xsd文件(yahoo.xsd),我在其中导入了另一个xsd文件,如下所示: stock.xsd看起来像这样: 当我使用xjc进行编译时,出现以下错误消息: [错误]属性“符号”已经定义。使用 解决此冲突。 我基本上在SO上找到了解决此问题的方法(JAXB编译问题-[ERROR]属性“Any”已经定义),但是我无法使其正常工作。我猜我的XPath是错误的。 这是我正在使用的绑定