gtest.lib 和 gtest_main.lib 有什么区别?

问题描述 投票:0回答:3

Google 的 C++ 测试框架有两个输出库:一个是 gtest.lib,另一个是 gtest_main.lib。根据 Nik Reiman 对 如何使用 Visual Studio 设置 gtest 的回答,我们应该链接到 gtest_main.lib,但我链接到 gtest.lib 并且我拥有的示例测试用例运行良好。

这两个库有什么区别?链接到哪一个有什么关系吗?

c++ visual-studio-2008 linker googletest
3个回答
37
投票
唯一合理的区别是

gtest_main.lib 提供了测试应用程序入口点的默认实现(即 main

 函数):

引自

Google C++ 测试框架入门

“[...]也许你认为写作 所有这些 main() 函数太多了 工作?我们完全同意你的观点并且 这就是为什么 Google Test 提供了 main() 的基本实现。如果它 满足您的需求,然后只需链接您的 使用 gtest_main 库进行测试 很高兴出发。”

如果您想自己编写主函数 - 您应该链接到

gtest.lib


11
投票
事实上,可用于 googletest 的各种构建方法并不能一致地构建库。至少这部分是一致的:

测试

gtest 库(分别称为

gtest.a

gtest.so
gtest.lib
libgtest.a
 等,具体取决于您的平台以及是否使用共享库)包含 gtest 框架的目标代码,包括测试需要。基本上它实现了 
gtest/gest.h
 中您可以使用的所有内容。它
包含main()
方法。

gtest_main

它包含一个简单的 main 方法,将启动已注册的测试,如下所示(从 1.8 开始):

GTEST_API_ int main(int argc, char **argv) { printf("Running main() from gtest_main.cc\n"); testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }

现在不一致的部分是

gtest_main

有时
also包含gtest
中的所有内容,因此您
only需要链接到eithergtest
(如果你想编写自己的
main()
方法) 
gtest_main
(如果您想使用上面的固定 main 方法)。例如,如果您使用 
Makefile
中包含的
googletest/make
构建,就是这种情况:

gtest.a : gtest-all.o $(AR) $(ARFLAGS) $@ $^ gtest_main.a : gtest-all.o gtest_main.o $(AR) $(ARFLAGS) $@ $^

显然,

gtest_main.a

包含了
gtest.a
所做的一切,
plus包含了主要功能的gtest-main.o
对象。

但是,对于 CMake 构建,情况有所不同,至少对于某些构建工件而言。例如,对于主要库

我们有

cxx_library(gtest "${cxx_strict}" src/gtest-all.cc) cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc) target_link_libraries(gtest_main gtest)

这里,

gtest_main

包含主要功能,没有其他内容1target_link_libraries
行告诉其他任何事情
使用此CMake构建,如果您链接gtest_main
,您还应该链接
gtest
,因此在文件的其余部分中,通常会看到仅针对
gtest_main
链接的内容。事实上,
CMakeLists.txt
 文件中前面的文档明确说明了这一点:

# Defines the gtest & gtest_main libraries. User tests should link # with one of them.

注意“与他们一一”部分。他们真正的意思是,如果您使用相同的 CMake 系统进行构建,您可以做到这一点,但在实际链接级别,您需要

libtest.a

libgtest_main.a
,否则您将无法提取编写所需的内容测试。


1 事实上,使用 CMake libgtest.a 最终有 1,755,216 字节,而 libgtest_main.a 只有区区 3,836 字节。对于 ../make/Makefile

 版本,这些数字分别为 3,365,240 和 3,398,356。显然,除了所包含的文件之外,还存在一些差异,导致 
Makefile
 版本的大小增大。


-4
投票
您需要通过单元测试将

gtest.lib

 链接到您的项目。

© www.soinside.com 2019 - 2024. All rights reserved.