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
函数):
"[...]也许您认为编写所有main()函数的工作量太大了?我们完全同意您的看法,这就是为什么Google Test提供了main()的基本实现.如果它符合您的需求,那么只需链接使用gtest_main库进行测试,你很高兴."
如果你想自己编写主要功能 - 你应该与gtest.lib链接.
事实上,可用于 googletest 的各种构建方法并不能始终如一地构建库。至少这部分是一致的:
gtest 库(根据您的平台以及您是否使用共享库而不同,称为gtest.a
、gtest.so
、gtest.lib
或libgtest.a
等)包含 gtest 框架的目标代码,包括测试所需的一切。基本上它实现了你可以从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();
}
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.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
版本的大小。