Как настроить googleTest как общую библиотеку в Linux


87

Debian больше не предоставляет предварительно скомпилированных пакетов для gTest. Они предлагают вам интегрировать фреймворк в make-файл вашего проекта. Но я хочу, чтобы мой make-файл был чистым. Как мне настроить gTest, как предыдущие версии (<1.6.0), чтобы я мог ссылаться на библиотеку?


2
Кстати, сборки gtest управляются с помощью autotools, поэтому стандартный ./configure && make && make installрабочий процесс должен работать нормально. Я не уверен, что это оправдывает публикацию, поскольку это не будет отличаться от компиляции многих других пакетов из исходников.
Shawn Chin

7
Думаю, не все пользователи так опытны, как вы. Я недавно перешел с Windows на Linux и был бы счастлив найти что-то подобное на StackOverflow.
ManuelSchneid3r

1
Обратите внимание, что Google рекомендует НЕ создавать библиотеку, а вместо этого включать код GTest в свой проект. См. Code.google.com/p/googletest/wiki/…
Мавг требует восстановить Монику на работе

Это первая нота в ответе.
ManuelSchneid3r,

1
Ссылка, предоставленная @Mawg, не работает (wiki была удалена), похоже, она работает, но указывает на страницу, которая больше не по теме (довольно запутанно). Лучшее, что я могу найти в качестве замены, - это инструкции по сборке: github.com/google/googletest/blob/master/googletest/README.md Однако это объясняет только, как создавать с помощью cmake. Для автоинструментов я нашел следующий ответ: stackoverflow.com/a/36000856/1487069
Карло Вуд,

Ответы:


143

Прежде чем начать, убедитесь, что вы прочитали и поняли эту заметку от Google ! Это руководство упрощает использование gtest, но может содержать неприятные ошибки .

1. Получите фреймворк googletest.

wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz

Или получить в руки . Я не буду поддерживать это небольшое руководство, поэтому, если вы наткнулись на него, а ссылки устарели, не стесняйтесь редактировать его.

2. Распаковать и собрать google test

tar xf release-1.8.0.tar.gz
cd googletest-release-1.8.0
cmake -DBUILD_SHARED_LIBS=ON .
make

3. «Установите» заголовки и библиотеки в вашу систему.

Этот шаг может отличаться от дистрибутива к дистрибутиву, поэтому убедитесь, что вы скопировали заголовки и библиотеки в правильный каталог. Я добился этого, проверив, где находились бывшие gtest-библиотеки Debians . Но я уверен, что есть способы сделать это лучше. Примечание: make installопасно и не поддерживается

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/gtest/libgtest_main.so googlemock/gtest/libgtest.so /usr/lib/

4. Обновите кеш компоновщика.

... и проверьте, знает ли GNU Linker библиотеки

sudo ldconfig -v | grep gtest

Если результат выглядит так:

libgtest.so.0 -> libgtest.so.0.0.0
libgtest_main.so.0 -> libgtest_main.so.0.0.0

то все в порядке.

gTestframework теперь готов к использованию. Просто не забудьте связать свой проект с библиотекой, установив -lgtestфлаг компоновщика и, при желании, если вы не писали свою собственную тестовую mainroutine, явный -lgtest_mainфлаг.

Отсюда вы можете перейти к документации Googles и старым документам о фреймворке, чтобы узнать, как он работает. Удачного кодирования!

Изменить: это работает и для OS X! См. «Как правильно настроить googleTest на OS X».


2
Нет ли make installцели, которую вы могли бы использовать вместо ручного копирования библиотеки и заголовков?
Shawn Chin

13
Цитата из вывода make-файла:'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
ManuelSchneid3r

Были ли файлы переименованы в версии 1.8.0? Там нет include/gtest, насколько я могу судить.
Nubcake

2
Ваше сообщение устарело. Пожалуйста, не вводите людей в заблуждение, sudo cp -a libgtest_main.so libgtest.so /usr/lib/больше не работает. Файла даже там нет.
Schütze

Я также хотел бы знать, почему debian удалил предустановленную общую библиотеку (они сделали это в соответствии с рекомендациями разработчиков: bugs.debian.org/cgi-bin/bugreport.cgi?bug=802587 ). Однако приведенная там вики-ссылка больше не существует. Так почему же так?
Carlo Wood

33

Позвольте мне ответить на этот вопрос специально для пользователей Ubuntu. Сначала начните с установки пакета разработки gtest.

sudo apt-get install libgtest-dev

Обратите внимание, что этот пакет устанавливает только исходные файлы. Вы должны сами скомпилировать код, чтобы создать необходимые файлы библиотеки. Эти исходные файлы должны находиться в / usr / src / gtest. Перейдите в эту папку и используйте cmake для компиляции библиотеки:

sudo apt-get install cmake # install cmake
cd /usr/src/gtest
sudo mkdir build
cd build
sudo cmake ..
sudo make
sudo make install

Теперь, чтобы скомпилировать ваши программы, использующие gtest, вы должны связать его с:

-lgtest -lgtest_main -lpthread

У меня это отлично сработало на Ubuntu 14.04LTS.


1
На самом деле вам не нужно копировать библиотеки вручную, для этого есть цель в Makefile. Вы можете сделать это так: sudo apt-get install cmake # install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install Это должно быть создано и скопировано / usr / local / lib /
Александр Зиновьев,

1
@AlexanderZinovyev Я получаю "make: *** Нет правила для установки цели. Стоп." когда я выполняю команду «sudo make install»
m4l490n

2
«sudo make install» работала в Ubuntu 18.04, но не работала в Ubuntu 16.04.
Ахмед Нассар

1
@AhmedNassar: «sudo make install» делает то же самое, что и «sudo cp * .a / usr / lib». Итак, если опция установки недоступна в сгенерированном Makefile, вы просто копируете их вручную
amritkrs

Нет необходимости вручную sudo cp *.a /usr/lib, просто замените это с помощью sudo make install.
lingjiankong

26

Мне потребовалось время, чтобы понять это, потому что обычная команда make install была удалена, и я не использую cmake. Вот мой опыт, которым я хочу поделиться. На работе у меня нет доступа к корневой на Linux, так что я установил рамки тест Google под моей домашней директории: ~/usr/gtest/.

Чтобы установить пакет в ~ / usr / gtest / как общие библиотеки вместе с образцом сборки:

$ mkdir ~/temp
$ cd ~/temp
$ unzip gtest-1.7.0.zip 
$ cd gtest-1.7.0
$ mkdir mybuild
$ cd mybuild
$ cmake -DBUILD_SHARED_LIBS=ON -Dgtest_build_samples=ON -G"Unix Makefiles" ..
$ make
$ cp -r ../include/gtest ~/usr/gtest/include/
$ cp lib*.so ~/usr/gtest/lib

Чтобы проверить установку, используйте следующий test.c в качестве простого тестового примера:

    #include <gtest/gtest.h>
    TEST(MathTest, TwoPlusTwoEqualsFour) {
        EXPECT_EQ(2 + 2, 4);
    }

    int main(int argc, char **argv) {
        ::testing::InitGoogleTest( &argc, argv );
        return RUN_ALL_TESTS();
    }

Компилировать:

    $ export GTEST_HOME=~/usr/gtest
    $ export LD_LIBRARY_PATH=$GTEST_HOME/lib:$LD_LIBRARY_PATH
    $ g++ -I $GTEST_HOME/include -L $GTEST_HOME/lib -lgtest -lgtest_main -lpthread test.cpp 

1
В последней строке появляется ошибка: / usr / bin / ld: /tmp/cczG727X.o: неопределенная ссылка на символ _ZN7testing4TestC2Ev. Я исправил это размещение test.cpp перед библиотеками. т.е.: g ++ test.cpp -I $ GTEST_HOME / include -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread
user9869932

При связывании с gtest_main ( lgtest_main) нет необходимости определять свою собственную mainв тестовом файле.
Gino Mempin,

10

Если вы используете CMake, вы можете использовать, ExternalProject_Addкак описано здесь .

Это избавляет вас от необходимости хранить исходный код gtest в вашем репозитории или устанавливать его где угодно. Он автоматически загружается и встраивается в ваше дерево сборки.


2

Обновление для Debian / Ubuntu

Google Mock (пакет:) google-mockи Google Test (пакет libgtest-dev:) были объединены. Новый пакет называется googletest. Оба старых имени по-прежнему доступны для обратной совместимости и теперь зависят от нового пакета googletest.

Итак, чтобы получить свои библиотеки из репозитория пакетов, вы можете сделать следующее:

sudo apt-get install googletest -y
cd /usr/src/googletest
sudo mkdir build
cd build
sudo cmake ..
sudo make
sudo cp googlemock/*.a googlemock/gtest/*.a /usr/lib

После этого вы можете ссылаться на -lgmock(или против, -lgmock_mainесли вы не используете настраиваемый основной метод) и -lpthread. По крайней мере, в моих случаях этого было достаточно для использования Google Test.

Если вам нужна самая последняя версия Google Test, скачайте ее с github. После этого действия аналогичны:

git clone https://github.com/google/googletest
cd googletest
sudo mkdir build
cd build
sudo cmake ..
sudo make
sudo cp lib/*.a /usr/lib

Как видите, путь создания библиотек изменился. Имейте в виду, что новый путь может скоро стать действительным и для репозиториев пакетов.

Вместо того, чтобы копировать библиотеки вручную, вы можете использовать sudo make install. Он работает «в настоящее время», но имейте в виду, что в прошлом он не всегда работал. Кроме того, при использовании этой команды у вас нет контроля над целевым местоположением, и вы, возможно, не захотите загрязнять /usr/lib.


1

Я был так же разочарован этой ситуацией и в итоге создал для этого свои собственные пакеты с исходным кодом Ubuntu. Эти пакеты с исходным кодом позволяют легко создавать двоичный пакет. Они основаны на последних исходниках gtest и gmock, опубликованных в этой публикации.

Пакет исходного кода Google Test DEB

Пакет исходного кода Google Mock DEB

Чтобы собрать двоичный пакет, сделайте следующее:

tar -xzvf gtest-1.7.0.tar.gz
cd gtest-1.7.0
dpkg-source -x gtest_1.7.0-1.dsc
cd gtest-1.7.0
dpkg-buildpackage

Он может сказать вам, что вам нужны некоторые предварительные пакеты, и в этом случае вам просто нужно установить их apt-get. Кроме того, собранные двоичные пакеты .deb должны находиться в родительском каталоге.

Для GMock процесс такой же.

В качестве побочного примечания, хотя это и не относится к моим исходным пакетам, при связывании gtest с вашим модульным тестом убедитесь, что gtest включен первым ( https://bbs.archlinux.org/viewtopic.php?id=156639 ). Это похоже на общие ошибки.


Когда я пытаюсь скомпилировать, ваш пакет выдает ошибки. Любая причина, почему ?? вот мой журнал test.cpp :(. text + 0x57): undefined ссылка на testing::Message::Message()' test.cpp:(.text+0x84): undefined reference to testing :: internal :: AssertHelper :: AssertHelper (testing :: TestPartResult :: Type, char const *, int, char const *) 'test. cpp :(. text + 0x97): undefined ссылка на `testing :: internal :: AssertHelper :: operator = (testing :: Message const &) const '... это так долго, что я не могу опубликовать всю вещь. Я сделал это на новой виртуальной машине Ubuntu 14.04, поэтому ничего не было установлено, кроме необходимых зависимостей.
ddelnano

@ddelnano Да, я тоже наткнулся на этот маленький тестовый гугл. Очевидно порядок разделяемых библиотек важен. При связывании gtest со своим модульным тестом попробуйте включить gtest перед другими библиотеками. Когда я столкнулся с этой проблемой, эта ссылка решила ее для меня: bbs.archlinux.org/viewtopic.php?id=156639
Ник

@ddelnano, также, если в вашем наборе тестов не определен main, не забудьте связать с gtest_main.
Ник Уидон

Никаких других библиотек я не включал. это все, что у меня было в файле #include <gtest/gtest.h> TEST(MathTest, TwoPlusTwoEqualsFour) { EXPECT_EQ(2 + 2, 4); } int main(int argc, char **argv) { ::testing::InitGoogleTest( &argc, argv ); return RUN_ALL_TESTS(); }
ddelnano

неважно, я не прочитал сообщение в блоге, пока не опубликовал этот комментарий. Теперь он наконец-то работает!
ddelnano

1

На всякий случай, если кто-то еще попадает в такую ​​же ситуацию, как я вчера (2016-06-22), и также не преуспевает с уже опубликованными подходами - Lubuntu 14.04у меня это сработало, используя следующую цепочку команд:

git clone https://github.com/google/googletest
cd googletest
cmake -DBUILD_SHARED_LIBS=ON .
make
cd googlemock
sudo cp ./libgmock_main.so ./gtest/libgtest.so gtest/libgtest_main.so ./libgmock.so /usr/lib/
sudo ldconfig

1

Этот ответ от askubuntu сработал для меня. Кажется проще, чем другие варианты, и менее подвержен ошибкам, поскольку он использует package libgtest-devдля получения исходных кодов и сборок оттуда: /ubuntu/145887/why-no-library-files-installed-for-google- test? answertab = голосов # tab-top

Пожалуйста, обратитесь к этому ответу, но в качестве ярлыка я также предлагаю шаги здесь:

sudo apt-get install -y libgtest-dev
sudo apt-get install -y cmake
cd /usr/src/gtest
sudo cmake .
sudo make
sudo mv libg* /usr/lib/

После этого я мог построить свой проект, от которого gtestне было проблем.


1

Следующий метод позволяет избежать ручной работы с /usr/libкаталогом, а также требует минимального изменения в вашем CMakeLists.txtфайле. Это также позволяет вашему диспетчеру пакетов полностью удалитьlibgtest-dev .

Идея в том, что когда вы получаете libgtest-devпосылку через

sudo apt install libgtest-dev

Источник хранится в локации /usr/src/googletest

Вы можете просто указать свой CMakeLists.txtкаталог, чтобы найти необходимые зависимости.

Просто замените FindGTestнаadd_subdirectory(/usr/src/googletest gtest)

В итоге должно получиться так

add_subdirectory(/usr/src/googletest gtest)
target_link_libraries(your_executable gtest)

0

Это установит тестовую и фиктивную библиотеку Google в системе на основе Ubuntu / Debian:

sudo apt-get install google-mock

Протестировано в облаке Google в образе на основе Debian.


Хм, нет, думаю, только устанавливает googlemock, а не устанавливает googletest(gtest). По крайней мере, так случилось со мной.
jotadepicas

0

Это соберет и установит как gtest, так и gmock 1.7.0:

mkdir /tmp/googleTestMock
tar -xvf googletest-release-1.7.0.tar.gz -C /tmp/googleTestMock
tar -xvf googlemock-release-1.7.0.tar.gz -C /tmp/googleTestMock
cd /tmp/googleTestMock
mv googletest-release-1.7.0 gtest
cd googlemock-release-1.7.0
cmake -DBUILD_SHARED_LIBS=ON .
make -j$(nproc)
sudo cp -a include/gmock /usr/include
sudo cp -a libgmock.so libgmock_main.so /usr/lib/
sudo cp -a ../gtest/include/gtest /usr/include
sudo cp -a gtest/libgtest.so gtest/libgtest_main.so /usr/lib/
sudo ldconfig

-1

Для 1.8.1 на основе ответа @ ManuelSchneid3r мне пришлось сделать:

wget github.com/google/googletar xf release-1.8.1.tar.gz 
tar xf release-1.8.1.tar.gz
cd googletest-release-1.8.1/
cmake -DBUILD_SHARED_LIBS=ON .
make

Затем я сделал, make installчто, казалось, работает для 1.8.1, но после @ ManuelSchneid3r это будет означать:

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/include/gmock /usr/include
sudo cp `find .|grep .so$` /usr/lib/

Я давно написал этот ответ, дайте мне знать, в чем проблема, если вы думаете, что он не имеет значения / недействителен.
ntg
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.