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

Kir*_*ril 27 c++ linker googletest visual-studio-2008

Google的C++ Test Framework有两个输出库:一个是gtest.lib,另一个是gtest_main.lib.根据Nik Reiman关于如何使用Visual Studio设置gtest 的答案,我们应该链接到gtest_main.lib但是我链接到gtest.lib并且我运行的示例测试用例运行正常.

两个库之间有什么区别,我链接到哪一个是否重要?

And*_*rey 23

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

Google C++测试框架入门引用:

"[...]也许您认为编写所有main()函数的工作量太大了?我们完全同意您的看法,这就是为什么Google Test提供了main()的基本实现.如果它符合您的需求,那么只需链接使用gtest_main库进行测试,你很高兴."

如果你想自己编写主要功能 - 你应该与gtest.lib链接.

  • gtest_main是**不是**替代gtest.如果你想以任何一种方式使用库,你需要链接gtest.如果您还想要默认的主要实现,还可以链接到gtest_main. (5认同)

Bee*_*ope 6

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

测试

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();
}
Run Code Online (Sandbox Code Playgroud)

现在矛盾的是,gtest_main有时包括一切从gtest,所以你需要对链接或者 gtest(如果你想编写自己的main()方法), gtest_main(如果你想使用上述罐头主要方法)。例如,如果您使用Makefile包含在 中的构建,就是这种情况googletest/make

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

gtest_main.a : gtest-all.o gtest_main.o
    $(AR) $(ARFLAGS) $@ $^
Run Code Online (Sandbox Code Playgroud)

显然,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)
Run Code Online (Sandbox Code Playgroud)

在这里,gtest_main 包含 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.
Run Code Online (Sandbox Code Playgroud)

注意“一一他们”部分。它们的真正意思是,如果您使用相同的 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版本的大小。