В чем разница между gtest.lib и gtest_main.lib?

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

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


person Kiril    schedule 23.06.2011    source источник
comment
Этот минимальный пример также может немного прояснить ситуацию: askubuntu .com/questions/97626/how-to-install-googletest/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 25.11.2020


Ответы (3)


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

Цитата из Начало работы с Google C++ Платформа тестирования:

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

Если вы хотите написать свою основную функцию самостоятельно, вам следует связать ее с gtest.lib.

person Andrey    schedule 23.06.2011
comment
Копировать/вставить main() — это больше работы, чем настройка вашего проекта для ссылки на gtest_main.lib? Я бы сказал, что это не так. В любом случае, спасибо за цитату. Мне было интересно, почему это было сделано именно так. - person chappjc; 06.05.2014
comment
gtest_main не является альтернативой gtest. Вам нужно связать с gtest, если вы хотите использовать библиотеку в любом случае. Если вы также хотите основную реализацию по умолчанию, также свяжите с gtest_main. - person Tamás Szelei; 09.01.2015
comment
У меня возникла проблема с настройкой gtest для работы над моим решением. Я добавил новый проект (скопировал исходный код из одного из примеров), добавил соответствующие каталоги включения и ссылки и указал gtest.lib и gtest_main.lib для ссылки. Если я соберу свой проект как .dll, тесты не будут обнаружены, а если я соберу как .exe, у меня не будет определенной точки входа. Как мне настроить мой проект для использования функции gtest_main main() в качестве точки входа? - person Zepee; 13.11.2015
comment
@TamásSzelei - похоже, это не так, по крайней мере, для сборки make в выпуске 1.8 (самый последний выпуск на сегодняшний день). Соответствующие зависимости — gtest-all.o gtest_main.o и gtest-all.o для gtest_main и gtest соответственно, поэтому gtest_main является надмножеством gtest и включает в себя все функции gtest. - person BeeOnRope; 09.02.2017
comment
@BeeOnRope Я не думаю, что это изменилось, хотя я использовал сборку cmake. В текущем основном коммите gtest_main не является надмножеством gtest: github .com/google/googletest/blob/master/googletest/ - person Tamás Szelei; 12.02.2017
comment
Интересный. Кажется, что сборки cmake и make просто несовместимы. Makefile находится здесь и четко указывает на gtest-all.o для gtest.a. Поскольку cmake кажется рекомендуемым способом построения в будущем, я предполагаю, что наиболее вероятным намерением является то, что вы gtest_main не включаете остальную часть кода, как вы упомянули. @TamásSzelei - person BeeOnRope; 12.02.2017
comment
@TamásSzelei - это было достаточно запутанно, я написал об этом ответ. Я думаю, что googletest излишне запутал вещи, но приведенное ниже должно полностью покрыть это. - person BeeOnRope; 12.02.2017
comment
@BeeOnRope вау, хорошая находка. Я думаю, что об этом стоит сообщить как об ошибке. - person Tamás Szelei; 13.02.2017
comment
@TamásSzelei, подано: github.com/google/googletest/issues/1015 — хотя с 354 открытыми вопросами у меня не слишком много надежд на быстрое решение. - person BeeOnRope; 14.02.2017

На самом деле, различные методы сборки, доступные для 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

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

person kiriloff    schedule 01.05.2015