36

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

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

4

3 回答 3

33

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

来自Google C++ 测试框架入门的引文:

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

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

于 2011-06-23T18:05:07.227 回答
7

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

测试

gtest 库(根据您的平台以及您是否使用共享库而不同地称为 、 或 等)包含 gtest 框架的目标代码,包括测试所需的gtest.a一切。基本上它实现了你可以使用的所有东西。它包括方法。gtest.sogtest.liblibgtest.agtest/gest.hmain()

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,因此您需要链接(如果您想编写自己的方法) 如果您想使用上面的罐头 main 方法)。例如,如果您使用包含在以下内容中的构建,就是这种情况:gtestmain() gtest_mainMakefilegoogletest/make

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 包含 main 函数,仅包含其他1。该行告诉使用此 CMake 构建target_link_libraries的其他任何内容,如果您链​​接,您还应该链接,因此在文件的其余部分中,通常会看到仅链接到. 事实上,文件前面的文档明确说明了这一点:gtest_maingtestgtest_mainCMakeLists.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版本的大小。

于 2017-02-12T17:44:55.207 回答
-4

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

于 2015-05-01T07:50:10.340 回答