使用 gtest 时"_main already defined"

"_main already defined" while using gtest

本文关键字:already defined main 使用 gtest      更新时间:2023-10-16

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

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

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

我的测试包括一个.CPP 文件,它使用 #include 调用 .h 文件,并且 main 函数 RUN_ALL_TESTS((

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

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

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

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

  • 项目1
    • file1.h
    • file1.cpp
    • main.cpp

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

因此,您将编译 project1 并将其与file1.hfile1.cppmain.cpp链接以获得可执行文件。

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

结构可以像

  • 项目1
    • file1.h
    • file1.cpp
    • main.cpp
  • 项目1测试
    • file1test.cpp
    • gtest_main.cpp

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

在 project1test 中,您将包含带有#include "../project1/file1.h"file1.h

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

-

-> 配置属性 --> 链接器 --> 输入 --> 其他依赖项 --> 添加"..\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 文件。

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

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

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

如果你不想使用 gtest main,恕我直言,你不应该包含gtest_main库。

我为这个问题使用了宏。我定义了一个 TESTING 宏,它在编译单元测试时计算结果为 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