Як налаштувати 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.