Подтвердить что ты не робот

Какая разница между gtest.lib и gtest_main.lib?

Google С++ Test Framework имеет две библиотеки вывода: один - gtest.lib, а другой - gtest_main.lib. Согласно Ответ Ник Реймана на как настроить gtest с помощью Visual Studio, мы должны ссылаться на gtest_main.lib, но Я привязываюсь к gtest.lib, и примеры тестовых примеров, которые у меня есть, работают нормально.

Какая разница между двумя библиотеками и имеет значение, на какой из них я ссылаюсь?

4b9b3361

Ответ 1

единственное разумное различие заключается в том, что gtest_main.lib предоставляет стандартную реализацию точки входа тестового приложения (т.е. main):

Ссылка из Начало работы с Google С++ Testing Framework:

"[...] может быть, вы думаете, что писать все функции main() слишком много Работа? Мы полностью согласны с вами и почему Google Test предоставляет основная реализация main(). Если оно соответствует вашим потребностям, а затем просто тест с библиотекой gtest_main, и вы хорошо идти".

Если вы хотите сами написать свою основную функцию - вам нужно установить ссылку 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.

Ответ 3

Вам нужно будет связать gtest.lib с вашим проектом с помощью модульных тестов.