Google的C ++ Test Framework有两个输出库:一个是gtest.lib,另一个是gtest_main.lib。根据{{3}}上的Nik Reiman's answer,我们应该链接到gtest_main.lib但我链接到gtest.lib并且我运行的示例测试用例运行正常。
这两个库之间的区别是什么?我链接到哪一个很重要?
答案 0 :(得分:21)
唯一合理的区别是 gtest_main.lib 提供了测试应用程序入口点的默认实现(即main
函数):
来自Getting started with Google C++ Testing Framework的引文:
“[...]也许你认为写作 所有那些main()函数都太多了 工作?我们完全同意你的意见 这就是Google Test提供的原因 main()的基本实现。如果它 满足您的需求,然后只需链接您的 用gtest_main库和你一起测试 很高兴。“
如果您想自己编写主要功能,则应链接 gtest.lib 。
答案 1 :(得分:3)
事实上,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();
}
现在不一致的部分是gtest_main
有时还包含来自gtest
的所有内容,因此仅需要链接 gtest
(如果您想编写自己的main()
方法)或 gtest_main
(如果您想使用上面的固定主方法) 。例如,如果您使用googletest/make
中包含的Makefile
版本,就会出现这种情况:
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构建时,情况会有所不同,至少对于某些构建工件而言。例如,对于主库we have:
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
仅包含主要功能,其他内容 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.
请注意“一个人”。他们真正的意思是,如果你使用相同的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
版本的大小。
答案 2 :(得分:-4)
您需要使用单元测试将float
链接到您的项目。