Pytanie Jak skonfigurować googleTest jako bibliotekę współdzieloną w systemie Linux


Debian nie zapewnia już żadnych prekompilowanych pakietów dla gTest. Sugerują, aby zintegrować framework z plikiem make make. Ale chcę zachować czystość mojego pliku make. Jak skonfigurować gTest tak, jak poprzednie wersje (<1.6.0), aby móc połączyć z biblioteką?


76
2017-11-22 13:38


pochodzenie


To wspaniale, że dzielisz się swoją wiedzą i doświadczeniem, dziękuję za wniesienie wkładu. Jest to jednak strona QA, więc wypytaj swoje pytanie jako pytanie, a nie jako rant. - Shawn Chin
BTW, projekty gtest są zarządzane za pomocą autotools, więc standardem ./configure && make && make install workflow powinien działać dobrze. Nie jestem pewien, czy to uzasadnia post, ponieważ nie różni się od kompilowania wielu innych pakietów ze źródła. - Shawn Chin
Wydaje mi się, że nie wszyscy użytkownicy są tak doświadczeni jak ty. Niedawno przyszedł z systemu Windows do systemu Linux i byłbym szczęśliwy, aby znaleźć coś takiego na StackOverflow. - ManuelSchneid3r
Pamiętaj, że Google NIE zaleca budowania biblioteki, lecz umieszcza kod GTest w projekcie. Widzieć code.google.com/p/googletest/wiki/... - Mawg
To pierwsza uwaga w odpowiedzi. - ManuelSchneid3r


Odpowiedzi:


Zanim zaczniesz upewnij się, że przeczytałeś i zrozumiałeś ta uwaga od Google! Ten samouczek sprawia, że ​​używanie gtest jest łatwe, ale może wprowadzić nieprzyjemne błędy.

1. Zdobądź framework googletest

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

Lub zdobądź to dłoń. Nie utrzymam tego małego poradnika, więc jeśli natknąłeś się na niego, a linki są nieaktualne, możesz je edytować.

2. Rozpakuj i zbuduj test Google

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

3. "Zainstaluj" nagłówki i biblioteki w swoim systemie.

Ten krok może się różnić od dystrybucji do dystrybucji, więc upewnij się, że skopiowałeś nagłówki i biblioteki w odpowiednim katalogu. Osiągnąłem to, sprawdzając gdzie Debiany były bibliotekami gtest zostały zlokalizowane. Ale jestem pewien, że są lepsze sposoby na zrobienie tego. Uwaga: make install jest niebezpieczne i nie jest obsługiwane

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

4. Zaktualizuj pamięć podręczną linkera

... i sprawdź, czy GNU Linker zna biblioteki

$ sudo ldconfig -v | grep gtest

Jeśli wynik wygląda następująco:

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

, wszystko w porządku.

gTestframework jest teraz gotowy do użycia. Po prostu nie zapomnij połączyć projektu z biblioteką, ustawiając -lgtest jako flagę linkera i opcjonalnie, jeśli nie napisałeś własnego testowego mainRoutine, jawne -lgtest_main flaga.

Odtąd możesz chcieć iść do Googles dokumentacja o strukturze, aby dowiedzieć się, jak to działa. Szczęśliwe kodowanie!

Edytować: Działa to również dla OS X! Widzieć "Jak poprawnie skonfigurować googleTest na OS X"


125
2017-11-22 13:38



Czy nie ma make install cel, którego można użyć zamiast ręcznego kopiowania biblioteki i nagłówków? - Shawn Chin
Cite wyniku pliku makefile: 'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system. - ManuelSchneid3r
Dzięki. Poprawiono mnie. - Shawn Chin
To działało jak czar. Dziękuję Ci! - gd1
Wielkie dzięki ManuelSchneid3r !!! To dobrze działa!! Ale brakuje gmock. - sree


Zajęło mi to trochę czasu, ponieważ normalna "make install" została usunięta i nie używam cmake. Oto moje doświadczenie udostępniania. W pracy nie mam dostępu do roota w Linuksie, więc zainstalowałem framework testowy Google w moim katalogu domowym: ~/usr/gtest/.

Aby zainstalować pakiet w ~ / usr / gtest / jako bibliotekach współdzielonych, razem z przykładową kompilacją:

$ 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

Aby sprawdzić poprawność instalacji, skorzystaj z poniższego pliku test.c jako prostego przykładowego testu:

    #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();
    }

Kompilować:

    $ 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 

24
2018-01-23 16:33



W ostatnim wierszu pojawia się błąd: / usr / bin / ld: /tmp/cczG727X.o: niezdefiniowane odwołanie do symbolu "_ZN7testing4TestC2Ev". Naprawiłem to umieszczając test.cpp przed bibliotekami. tj .: g ++ test.cpp -I $ GODZINA_HOME / include -L $ GODZINA_HOME / lib -lgtest -lgtest_main -lpthread - xyz
Dziękujemy za przykład sprawdzania poprawności - p1nkrock


Pozwól mi odpowiedzieć na to specjalnie dla użytkowników ubuntu. Najpierw zacznij od zainstalowania pakietu rozwojowego gtest.

sudo apt-get install libgtest-dev

Zwróć uwagę, że pakiet ten instaluje tylko pliki źródłowe. Musisz samodzielnie skompilować kod, aby utworzyć niezbędne pliki biblioteki. Te pliki źródłowe powinny znajdować się w katalogu / usr / src / gtest. Przejdź do tego folderu i użyj cmake, aby skompilować bibliotekę:

sudo apt-get install cmake # install cmake
cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make

# copy or symlink libgtest.a and libgtest_main.a to your /usr/lib folder
sudo cp *.a /usr/lib

Teraz, aby skompilować programy używające gtest, musisz połączyć je z:

-lgtest -lgtest_main

To działało idealnie dla mnie na Ubuntu 14.04LTS.


17
2018-01-31 09:43



Właściwie nie musisz ręcznie kopiować bibliotek, jest w tym cel w Makefile. Możesz to zrobić tak: sudo apt-get install cmake # install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install To powinno być zbudowane i skopiować / usr / local / lib / - Alexander Zinovyev
@AlexanderZinovyev Otrzymuję "make: *** Brak reguły, aby cel" zainstalować ". kiedy wykonuję "make install sudo" - m4l490n
"sudo make install" działało na Ubuntu 18.04, ale nie działało na Ubuntu 16.04. - Ahmed Nassar


Jeśli używasz CMake, możesz użyć ExternalProject_Add jak w opisie tutaj.

Pozwala to uniknąć konieczności przechowywania kodu źródłowego gto w repozytorium lub instalowania go w dowolnym miejscu. Jest on automatycznie pobierany i budowany w drzewie kompilacji.


7
2017-11-22 13:51





Byłem tak samo rozczarowany tą sytuacją i skończyłem tworzyć własne pakiety źródłowe Ubuntu. Te pakiety źródłowe umożliwiają łatwe tworzenie pakietu binarnego. Opierają się na najnowszym źródle gtest & gmock od tego wpisu.

Pakiet źródłowy Google Test DEB

Pakiet źródłowy Google Mock DEB

Aby zbudować pakiet binarny, wykonaj następujące czynności:

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

Może ci to oznaczać, że potrzebujesz pakietów z wymaganiami wstępnymi, w którym to przypadku musisz tylko zainstalować apt-get. Oprócz tego skompilowane pakiety binarne .deb powinny znajdować się w katalogu nadrzędnym.

W przypadku GMock proces jest taki sam.

Na marginesie, chociaż nie jest to specyficzne dla moich pakietów źródłowych, podczas dołączania gtest do testu jednostki, upewnij się, że gtest jest włączony jako pierwszy (https://bbs.archlinux.org/viewtopic.php?id=156639) Wydaje się, że to zwykły zamęt.


1
2018-03-26 13:32



Twój pakiet daje mi błędy przy próbie kompilacji. Jakiś powód, dlaczego ?? tutaj jest mój log test.cpp :(. text + 0x57): undefined odniesienie do testing::Message::Message()' test.cpp:(.text+0x84): undefined reference to testing :: internal :: AssertHelper :: AssertHelper (testowanie :: TestPartResult :: Type, char const *, int, char const *) 'test.cpp :(. text + 0x97): niezdefiniowane odniesienie do `testing :: internal: : AssertHelper :: operator = (testowanie :: Message const &) const '... tak długo, że nie mogę opublikować całej rzeczy. Zrobiłem to w zupełnie nowej maszynie Ubuntu 14.04, więc nic innego nie zostało zainstalowane z wyjątkiem niezbędnych zależności. - ddelnano
@ Ddelnano Tak, wpadłem na ten mały klejnot do testów Google. Wygląda na to, że kolejność bibliotek współdzielonych jest ważna. Podczas łączenia projektu z testem jednostkowym spróbuj dołączyć do innych bibliotek. Kiedy uderzyłem w ten problem, ten link rozwiązał go dla mnie: bbs.archlinux.org/viewtopic.php?id=156639 - Nick Weedon
@ddelnano, także jeśli twój zestaw testów nie ma zdefiniowanego "głównego", nie zapomnij połączyć z 'gtest_main'. - Nick Weedon
Nie zawierałem żadnych innych bibliotek. to wszystko, co miałem w moim pliku #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
nevermind Nie czytałem posta na blogu, dopóki nie opublikowałem tego komentarza. Teraz wreszcie działa! - ddelnano


Na wypadek, gdyby ktoś inny znalazł się w podobnej sytuacji jak ja wczoraj (2016-06-22), a także nie odniósł sukcesu z już opublikowanymi podejściami - na Lubuntu 14.04 zadziałało dla mnie za pomocą następującego łańcucha poleceń:

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
2018-06-23 14:30





Ta odpowiedź od askubuntu jest tym, co sprawdziło się u mnie. Wydaje się prostsze niż inne opcje mniej podatne na błędy, ponieważ używa pakietu libgtest-dev aby pobrać źródła i kompilacje z tego miejsca: https://askubuntu.com/questions/145887/why-no-library-files-installed-for-google-test?answertab=votes#tab-top

Odwołaj się do tej odpowiedzi, ale tak samo jak skrót, podaję tutaj również poniższe instrukcje:

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/

Potem mógłbym zbudować mój projekt, od którego zależy gtest bez problemów.


1
2017-12-24 07:09





Spowoduje to zainstalowanie google test i fałszywej biblioteki w systemie opartym na systemie Ubuntu / Debian:

sudo apt-get install google-mock

Przetestowano w chmurze Google w obrazie debianowym.


0
2017-11-11 22:42



Hmm, nie, myślę, że to tylko instaluje googlemock, ale nie instaluje się googletest (gtest). Przynajmniej tak mi się stało. - jotadepicas


Spowoduje to utworzenie i zainstalowanie zarówno wersji gtest, jak i 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

0
2018-01-04 10:50