gtest.lib 和 gtest_main.lib 有什么区别?
What's the difference between gtest.lib and gtest_main.lib?
谷歌的C++测试框架有两个输出库:一个是gtest.lib,另一个是gtest_main.lib。根据Nik Reiman关于如何使用Visual Studio设置gtest的回答,我们应该链接到gtest_main.ib,但我正在链接到gtest.lib,我拥有的示例测试用例运行良好。
这两个库有什么区别?我链接到哪个库有关系吗?
唯一合理的区别是gtest_main.lib提供了测试应用程序入口点(即main
函数)的默认实现:
谷歌C++测试框架入门引文:
"[…]也许你认为写作所有那些main()函数都太多了工作我们完全同意你的意见这就是Google Test提供main()的基本实现。如果符合您的需求,然后只需链接您的使用gtest_main库进行测试很适合去。"
如果你想自己编写主函数,你应该链接到gtest.lib.
事实上,可用于googletest的各种构建方法并不一致地构建库。不过,至少这一部分是一致的:
gtest
gtest库(根据您的平台和是否使用共享库,可以称为gtest.a
、gtest.so
、gtest.lib
或libgtest.a
等)包含gtest框架的目标代码,包括测试所需的一切。基本上,它实现了gtest/gest.h
中可以使用的所有内容。它不包括main()
方法。
gtest_main
它包括一个启动注册测试的琐碎的主要方法,类似于以下内容(自1.8起):
GTEST_API_ int main(int argc, char **argv) {
printf("Running main() from gtest_main.ccn");
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构建,情况有所不同,至少对于一些构建工件来说是这样。例如,对于我们拥有的主要库:
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最终为1755216字节,而libgtest_main.a仅为微不足道的3836字节。对于../make/Makefile
版本,这些数字分别为3365240和3398356。显然,除了所包含的文件之外,还存在一些差异,这些差异扩大了Makefile
版本的大小。
您将需要使用单元测试将gtest.lib
链接到您的项目。
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- JSON转换为nlohmann JSON-lib中的结构数组
- 在gtest.中使用fff.h模拟系统API
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何解决GTest和LibTorch联动冲突
- 如何将GTest与CMake一起使用?遵循谷歌指南时的链接问题
- 使用 VS2015 在 Windows 10 上构建 Fortran .lib x64 位并将其链接到 C++
- 为什么我的链接器在找到Coin4d.lib后搜索Coin4sd.lib?
- libcpmtd.lib有什么用?
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 解析引用 |exe/dll vs lib
- GTest,仅参数化测试用例
- 在 /usr/local/lib 下找不到库
- LLVM 编译:目标的配方 '../lib/IR/Release+Asserts/Intrinsics.gen.tmp' failed
- CMake 生成的 MSVC 项目找不到符号,即使为其相关 dll 正确生成了 lib 文件也是如此
- VS2015 未链接用户32.lib
- 使用 gtest 时"_main already defined"
- 在 Windows 10 下使用 GTest 的 CMake - 致命错误 LNK1104:无法打开文件"gtest.lib",但存在调试"gtestd.lib"
- gtest.lib 和 gtest_main.lib 有什么区别?