使用 gtest 时出现“_main 已定义”

"_main already defined" while using gtest

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

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

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

我的 gtest 包含一个 .CPP 文件,该文件使用 #include 调用 .h 文件和一个 RUN_ALL_TESTS()

的主要函数

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

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

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

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

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

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

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

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

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

因此,您可以使用 file1.hfile1.cppmain.cpp 编译并 link 您的项目 1 以获得可执行文件。

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

结构可能像

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

编辑 关于 linking 的附加信息:

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

正确 link 右击 project1test 项目

--> Configuration Properties --> Linker --> Input --> Additional Dependencies --> Add "..\project1\Debug\file1.obj"

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

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

您将获得一个 static/dynamic 库 project1library.lib/.dll、一个可执行文件 project1application.exe 和一个单元测试可执行文件 project1test.exe.

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

--> Configuration Properties --> Linker --> Input --> Additional Dependencies --> Add "..\project1library\Debug\project1library.lib"

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

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

我用宏来解决这个问题。我已经定义了一个 TESTING 宏,它在编译单元测试时评估为真,否则为假:

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

您也可以稍后将其用于源代码中的 "test" 代码。我有时会做什么(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