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

时间:2011-06-23 16:59:44

标签: c++ visual-studio-2008 linker googletest

Google的C ++ Test Framework有两个输出库:一个是gtest.lib,另一个是gtest_main.lib。根据{{​​3}}上的Nik Reiman's answer,我们应该链接到gtest_main.lib但我链接到gtest.lib并且我运行的示例测试用例运行正常。

这两个库之间的区别是什么?我链接到哪一个很重要?

3 个答案:

答案 0 :(得分:21)

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

来自Getting started with Google C++ Testing Framework的引文:

  

“[...]也许你认为写作   所有那些main()函数都太多了   工作?我们完全同意你的意见   这就是Google Test提供的原因   main()的基本实现。如果它   满足您的需求,然后只需链接您的   用gtest_main库和你一起测试   很高兴。“

如果您想自己编写主要功能,则应链接 gtest.lib

答案 1 :(得分:3)

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

GTEST

gtest库(不同地称为gtest.agtest.sogtest.liblibgtest.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有时包含来自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构建时,情况会有所不同,至少对于某些构建工件而言。例如,对于主库we have

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 包含主要功能,其他内容 1 target_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最终为1,755,216字节,而libgtest_main.a只有一个微不足道的3,836字节。使用../make/Makefile版本,这些数字分别为3,365,240和3,398,356。显然,除了包含的文件之外,还有一些差异会炸毁Makefile版本的大小。

答案 2 :(得分:-4)

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