На самом деле, различные методы сборки, доступные для googletest, не обеспечивают последовательной сборки библиотек. По крайней мере, эта часть непротиворечива:
тест
Библиотека 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
(если вы хотите использовать готовый основной метод выше). Например, если вы используете сборку 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 заканчивается на 1 755 216 байт, а libgtest_main.a составляет лишь мизерные 3 836 байт. Для сборки ../make/Makefile
эти цифры составляют 3 365 240 и 3 398 356 соответственно. Очевидно, помимо включенных файлов есть отличия, которые увеличивают размер версии Makefile
.
person
BeeOnRope
schedule
12.02.2017