В чем разница между gtest.lib и gtest_main.lib? - PullRequest
26 голосов
/ 23 июня 2011

Google C ++ Test Framework имеет две выходные библиотеки: одну - gtest.lib, а другую - gtest_main.lib. В соответствии с ответом Nik Reiman о о том, как настроить gtest с Visual Studio , мы должны ссылаться на gtest_main.lib, но я ссылаюсь на gtest.lib и примеры тестовых примеров, которые у меня есть работают нормально.

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

Ответы [ 3 ]

22 голосов
/ 23 июня 2011

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

Цитирование с Начало работы сGoogle C ++ Testing Framework :

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

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

3 голосов
/ 12 февраля 2017

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

0 голосов
/ 01 мая 2015

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

...