Фактически, различные методы сборки, доступные для 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.cc\n");
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Теперь противоречивая часть состоит в том, что gtest_main
иногда также включает в себя все, начиная с gtest
, так что вам только необходимо связать с либо gtest
(если вы хотите написать свой собственный метод main()
) или gtest_main
(если вы хотите использовать метод canned 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
только содержит основную функцию и ничего больше 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
эти цифры составляют соответственно 3 365 240 и 3 398 356. Очевидно, есть различия между включенными файлами, которые увеличивают размер Makefile
версии.