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

What's the difference between gtest.lib and gtest_main.lib?

本文关键字:gtest lib 区别 什么 main      更新时间:2023-10-16

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

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

唯一合理的区别是gtest_main.lib提供了测试应用程序入口点(即main函数)的默认实现:

谷歌C++测试框架入门引文:

"[…]也许你认为写作所有那些main()函数都太多了工作我们完全同意你的意见这就是Google Test提供main()的基本实现。如果符合您的需求,然后只需链接您的使用gtest_main库进行测试很适合去。"

如果你想自己编写主函数,你应该链接到gtest.lib.

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

gtest

gtest库(根据您的平台和是否使用共享库,可以称为gtest.agtest.sogtest.liblibgtest.a等)包含gtest框架的目标代码,包括测试所需的一切。基本上,它实现了gtest/gest.h中可以使用的所有内容。它不包括main()方法。

gtest_main

它包括一个启动注册测试的琐碎的主要方法,类似于以下内容(自1.8起):

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

现在不一致的部分是,gtest_main有时包括gtest的所有内容,因此需要链接gtest(如果您想编写自己的main()方法)gtest_main(如果您希望使用上面的罐装主方法)。例如,如果使用googletest/make:中包含的Makefile构建,则会出现这种情况

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

显然,gtest_main.a包含了gtest.a所做的一切,加上包含主函数的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.alibgtest_main.a,否则你就无法获得编写测试所需的内容。


1事实上,对于CMake,libgtest.a最终为1755216字节,而libgtest_main.a仅为微不足道的3836字节。对于../make/Makefile版本,这些数字分别为3365240和3398356。显然,除了所包含的文件之外,还存在一些差异,这些差异扩大了Makefile版本的大小。

您将需要使用单元测试将gtest.lib链接到您的项目。