使用 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.h
、file1.cpp
和 main.cpp
编译并 link 您的项目 1 以获得可执行文件。
对于单元测试,您将编译 link file1.h
、file1.cpp
、file1test.cpp
和 gtest_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
我有一个包含两个项目的解决方案
其中一个是控制台应用程序,另一个是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.h
、file1.cpp
和 main.cpp
编译并 link 您的项目 1 以获得可执行文件。
对于单元测试,您将编译 link file1.h
、file1.cpp
、file1test.cpp
和 gtest_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