Google 的 C++ 测试框架有两个输出库:一个是 gtest.lib,另一个是 gtest_main.lib。根据Nik Reiman关于如何使用 Visual Studio 设置 gtest的回答,我们应该链接到 gtest_main.lib 但我链接到 gtest.lib 并且我拥有的示例测试用例运行良好。
这两个库之间有什么区别,我链接到哪个库有关系吗?
Google 的 C++ 测试框架有两个输出库:一个是 gtest.lib,另一个是 gtest_main.lib。根据Nik Reiman关于如何使用 Visual Studio 设置 gtest的回答,我们应该链接到 gtest_main.lib 但我链接到 gtest.lib 并且我拥有的示例测试用例运行良好。
这两个库之间有什么区别,我链接到哪个库有关系吗?
唯一合理的区别是gtest_main.lib提供了测试应用程序入口点(即main
函数)的默认实现:
“[...] 也许你认为编写所有这些 main() 函数工作量太大?我们完全同意你的看法,这就是为什么 Google Test 提供了 main() 的基本实现。如果它符合你的需要,那么只需链接使用 gtest_main 库进行测试,一切顺利。”
如果您想自己编写主要功能 - 您应该与gtest.lib链接。
事实上,可用于 googletest 的各种构建方法并不能始终如一地构建库。至少这部分是一致的:
gtest 库(根据您的平台以及您是否使用共享库而不同地称为 、 或 等)包含 gtest 框架的目标代码,包括测试所需的gtest.a
一切。基本上它实现了你可以使用的所有东西。它不包括方法。gtest.so
gtest.lib
libgtest.a
gtest/gest.h
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 方法)。例如,如果您使用包含在以下内容中的构建,就是这种情况: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) $@ $^
显然,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_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
使用单元测试链接到您的项目。