Google С++ Test Framework имеет две библиотеки вывода: один - gtest.lib, а другой - gtest_main.lib. Согласно Ответ Ник Реймана на как настроить gtest с помощью Visual Studio, мы должны ссылаться на gtest_main.lib, но Я привязываюсь к gtest.lib, и примеры тестовых примеров, которые у меня есть, работают нормально.
Какая разница между двумя библиотеками и имеет значение, на какой из них я ссылаюсь?
Ответ 2
Фактически, различные методы сборки, доступные для 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
(если вы хотите использовать законченный основной метод выше). Это так, например, если вы используете конструкцию Makefile
, включенную в googletest/make
:
gtest.a : gtest-all.o
$(AR) $(ARFLAGS) [email protected] $^
gtest_main.a : gtest-all.o gtest_main.o
$(AR) $(ARFLAGS) [email protected] $^
Очевидно, что 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 386 байт. С помощью сборки ../make/Makefile
эти цифры составляют 3 365 240 и 3 398 356, соответственно. Очевидно, есть различия вне файлов, которые взорвали размер версии Makefile
.