Як налаштувати googleTest як спільну бібліотеку в Linux


87

Debian більше не пропонує жодних попередньо скомпільованих пакетів для gTest. Вони пропонують вам інтегрувати фреймворк у файл файлів вашого проекту. Але я хочу, щоб мій makefile був чистим. Як налаштувати gTest як попередні версії (<1.6.0), щоб я міг встановити посилання на бібліотеку?


2
До речі, збірками gtest управляють за допомогою автоінструментів, тому стандартний ./configure && make && make installробочий процес повинен працювати нормально. Я не впевнений, що це вимагає публікації, оскільки воно нічим не відрізнятиметься від компіляції багатьох інших пакунків із джерела.
— Шон Чін

7
Думаю, не всі користувачі мають такий досвід, як ви. Нещодавно я перейшов з Windows в Linux, і я був би радий знайти щось подібне на StackOverflow.
— ManuelSchneid3r

1
Зауважте, що Google рекомендує НЕ створювати бібліотеку, а натомість включати код GTest у свій проект. Див code.google.com/p/googletest/wiki / ...
— Mawg каже Моніка відновило

Це перша примітка у відповіді.
— ManuelSchneid3r

1
Посилання, надане @Mawg, не працює (вікі було видалено), схоже, воно працює, але вказує на сторінку, яка вже не в темі (досить заплутано). Найкраще, що я можу знайти як заміну, - це ці інструкції зі збірки: 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

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

3. "Встановіть" заголовки та бібліотеки у вашій системі.

Цей крок може відрізнятися від дистрибутива до дистрибутиву, тому обов’язково скопіюйте заголовки та бібліотеки у правильний каталог. Я досягнув цього, перевіривши, де розташовувались колишні гет-кішки Дебіана . Але я впевнений, що для цього є кращі способи. Примітка: 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як прапор зв’язувача, і необов’язково, якщо ви не написали власну тестову програму, явний -lgtest_mainпрапор.

З цього моменту ви можете перейти до документації Google і старих документів про фреймворк, щоб дізнатися, як це працює. Щасливого кодування!

Редагувати: Це працює і для OS X! Див. "Як правильно налаштувати googleTest на OS X"


2
Чи не існує make installцільової групи, яку можна використовувати замість копіювання бібліотеки та заголовків вручну?
— Шон Чін

13
Посилання на вихідний 'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
— файл

Файли були перейменовані у версію 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 ). Наведене там посилання на вікі вже не існує. То чому так було?
— Карло Вуд

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файл у тестовому файлі.
— Джино Мемпін,

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

Я був так само вражений цією ситуацією, і в підсумку створив власні пакунки-джерела для цього. Ці вихідні пакети дозволяють легко створити двійковий пакет. Вони базуються на останньому джерелі gtest & gmock станом на цей пост.

Google Test DEB Source Package

Google Mock DEB Source Package

Щоб побудувати двійковий пакет, зробіть це:

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): невизначене посилання на 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): невизначене посилання на `testing :: internal :: AssertHelper :: operator = (testing :: Message const &) const '... це так довго, що я не можу опублікувати всю річ. Я зробив це в новій версії Ubuntu 14.04 VM, тому не було встановлено нічого іншого, крім необхідних залежностей.
— ddelnano

@ddelnano Так, я теж зіткнувся з цим маленьким тестом Google. Очевидно, порядок спільних бібліотек важливий. Прив'язуючи 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

Про всяк випадок, коли хтось потрапить у таку ж ситуацію, як я вчора (22.06.2016), і також не досягне успіху з уже опублікованими підходами - 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 - це те, що мені вдалося. Здається простішим, ніж інші варіанти, менш схильним до помилок, оскільки він використовує пакет libgtest-devдля отримання джерел та збірок звідти: /ubuntu/145887/why-no-library-files-installed-for-google- test? answertab = votes # 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.