使用 gtest 时"_main already defined"
"_main already defined" while using gtest
我有一个包含两个项目的解决方案
其中一个是控制台应用程序,另一个是谷歌测试项目
我的项目有一个 .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.h
、file1.cpp
和main.cpp
链接以获得可执行文件。
对于单元测试,您需要编译和链接单元测试可执行文件的file1.h
、file1.cpp
、file1test.cpp
和gtest_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
- 如果两个静态库使用相同的另一个静态库,如何避免"LNK2005 Already Defined error"?
- 使用 gtest 时"_main already defined"
- "... already defined in *.obj"但我没有在同一范围内两次定义任何变量
- 是什么导致了代码中出现"error LNK2005: already defined in .obj"错误?
- 在VS 2015中使用Microchip的mpusbapi.h会产生"LNK2005 Already defined"错误
- "Destructor already defined"专用析构函数
- 由 Boost 单元测试框架 dll 导出的 std::basic_ostringstream 会导致"already defined symbol"错误
- 为什么"already defined"?
- 导致链接器错误的单一实例:"already defined"
- 避免 c++ none 类变量中的"already defined in ..."错误/交战
- 全局指针"already defined in"错误
- 编译错误"already defined"
- 如何在此处收到"already defined"链接器错误?
- 错误 LNK2005:"already defined in SkinHeaderCtrl.obj"
- C++ 可变参数模板"multiple definitions"/"already defined"问题
- 无法通过"DllMain already defined"错误
- LNK2005 (already defined)
- miniz.c 在 VS 中出现"already defined"错误
- C++03 链接器"already defined symbol"未显示在中间文件中
- LNK2005 .obj 中的函数指针数组"already defined"