Google 的 C++ 测试框架有两个输出库:一个是 gtest.lib,另一个是 gtest_main.lib。根据 Nik Reiman 对 如何使用 Visual Studio 设置 gtest 的回答,我们应该链接到 gtest_main.lib,但我链接到 gtest.lib 并且我拥有的示例测试用例运行良好。
这两个库有什么区别?链接到哪一个有什么关系吗?
gtest_main.lib 提供了测试应用程序入口点的默认实现(即 main
函数):引自
Google C++ 测试框架入门:
“[...]也许你认为写作 所有这些 main() 函数太多了 工作?我们完全同意你的观点并且 这就是为什么 Google Test 提供了 main() 的基本实现。如果它 满足您的需求,然后只需链接您的 使用 gtest_main 库进行测试 很高兴出发。”如果您想自己编写主函数 - 您应该链接到
gtest.lib。
测试
gtest.a
、
gtest.so
、
gtest.lib
或
libgtest.a
等,具体取决于您的平台以及是否使用共享库)包含 gtest 框架的目标代码,包括测试需要。基本上它实现了
gtest/gest.h
中您可以使用的所有内容。它不包含
main()
方法。gtest_main
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需要链接到either
gtest
(如果你想编写自己的
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
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.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
版本的大小增大。
gtest.lib
链接到您的项目。