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

87

Debian nie dostarcza już żadnych prekompilowanych pakietów dla gTest. Sugerują integrację frameworka z plikiem makefile projektu. Ale chcę, aby mój plik Makefile był czysty. Jak skonfigurować gTest, tak jak poprzednie wersje (<1.6.0), aby móc połączyć się z biblioteką?

ManuelSchneid3r
źródło
2
BTW, kompilacje gtest są zarządzane za pomocą narzędzi automatycznych, więc standardowy ./configure && make && make installprzepływ pracy powinien działać dobrze. Nie jestem pewien, czy to uzasadnia post, ponieważ nie różniłby się od kompilowania wielu innych pakietów ze źródła.
Shawn Chin
7
Myślę, że nie wszyscy użytkownicy są tak doświadczeni jak Ty. Niedawno przeszedłem z Windowsa na Linuksa i byłbym szczęśliwy, mogąc znaleźć coś takiego w StackOverflow.
ManuelSchneid3r
1
Zwróć uwagę, że Google zaleca, aby NIE budować biblioteki, ale zamiast tego dołączyć kod GTest do swojego projektu. Zobacz code.google.com/p/googletest/wiki/…
Mawg mówi, że przywróć Monikę
To pierwsza uwaga w odpowiedzi.
ManuelSchneid3r
1
Link podany przez @Mawg jest uszkodzony (wiki zostało usunięte), wydaje się działać, ale wskazuje na stronę, która nie jest już na temat (dość myląca). Najlepsze, co mogę znaleźć jako zamiennik, to te instrukcje kompilacji: github.com/google/googletest/blob/master/googletest/README.md Jednak to wyjaśnia tylko, jak budować za pomocą cmake. W przypadku narzędzi automatycznych znalazłem następującą odpowiedź, która działa najlepiej: stackoverflow.com/a/36000856/1487069
Carlo Wood

Odpowiedzi:

143

Zanim zaczniesz, upewnij się, że przeczytałeś i zrozumiałeś tę notatkę od Google ! Ten samouczek ułatwia korzystanie z gtest, ale może wprowadzać nieprzyjemne błędy .

1. Pobierz googletest framework

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

Lub zdobądź to ręcznie . Nie będę zajmować się tym małym poradnikiem, więc jeśli natknąłeś się na to i 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 systemie.

Ten krok może się różnić w zależności od dystrybucji, więc upewnij się, że kopiujesz nagłówki i biblioteki do odpowiedniego katalogu. Osiągnąłem to, sprawdzając, gdzie znajdowały się poprzednie biblioteki Debiana gtest . Ale jestem pewien, że istnieją lepsze sposoby, aby to zrobić. Uwaga: make installjest niebezpieczny i nie jest obsługiwany

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

4. Zaktualizuj pamięć podręczną konsolidatora

... 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

wtedy wszystko jest w porządku.

gTestframework jest teraz gotowy do użycia. Po prostu nie zapomnij połączyć swojego projektu z biblioteką, ustawiając -lgtestflagę konsolidatora i opcjonalnie, jeśli nie napisałeś własnej głównej procedury testowej, -lgtest_mainflagę jawną .

Odtąd możesz chcieć przejść do dokumentacji Google i starej dokumentacji na temat frameworka, aby dowiedzieć się, jak to działa. Miłego kodowania!

Edycja: Działa to również dla OS X! Zobacz „Jak prawidłowo skonfigurować GoogleTest w systemie OS X”

ManuelSchneid3r
źródło
2
Czy nie ma make installcelu, którego można użyć zamiast ręcznego kopiowania biblioteki i nagłówków?
Shawn Chin
13
Cytuj wynik pliku makefile:'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
ManuelSchneid3r.
Czy w wersji 1.8.0 zostały zmienione nazwy plików? Nie ma include/gtesto ile mogę powiedzieć.
Nubcake
2
Twój post jest nieaktualny. Proszę nie wprowadzać ludzi w błąd, sudo cp -a libgtest_main.so libgtest.so /usr/lib/już nie działa. Pliku nie ma nawet na początku.
Schütze
Chciałbym również wiedzieć, dlaczego debian usunął preinstalowaną bibliotekę współdzieloną (zrobili to zgodnie z zaleceniami upstreams: bugs.debian.org/cgi-bin/bugreport.cgi?bug=802587 ). Jednak podany tam link wiki już nie istnieje. Więc dlaczego tak się stało?
Carlo Wood
33

Odpowiem na to specjalnie dla użytkowników Ubuntu. Najpierw zainstaluj pakiet programistyczny gtest.

sudo apt-get install libgtest-dev

Zauważ, że ten pakiet instaluje tylko pliki źródłowe. Musisz sam skompilować kod, aby utworzyć niezbędne pliki biblioteczne. Te pliki źródłowe powinny znajdować się w / 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 mkdir build
cd build
sudo cmake ..
sudo make
sudo make install

Teraz, aby skompilować swoje programy, które używają gtest, musisz połączyć je z:

-lgtest -lgtest_main -lpthread

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

amritkrs
źródło
1
Właściwie nie musisz ręcznie kopiować bibliotek, jest to cel w Makefile. Możesz to zrobić w ten sposób: sudo apt-get install cmake # install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install To powinno zostać zbudowane i skopiuj / usr / local / lib /
Alexander Zinovyev
1
@AlexanderZinovyev Otrzymuję "make: *** Brak reguły, która sprawiłaby, że docelowa" instalacja ". Stop." kiedy
wykonuję
2
„sudo make install” działało na Ubuntu 18.04, ale nie działało na Ubuntu 16.04.
Ahmed Nassar
1
@AhmedNassar: "sudo make install" robi to samo, co "sudo cp * .a / usr / lib". Jeśli więc opcja instalacji nie jest dostępna w wygenerowanym pliku Makefile, wystarczy skopiować je ręcznie
amritkrs
Nie ma potrzeby ręcznego sudo cp *.a /usr/lib, po prostu wymień go za pomocą sudo make installpowinno wystarczyć.
lingjiankong
26

Zajęło mi to trochę czasu, ponieważ normalna "make install" została usunięta i nie używam cmake. Oto moje doświadczenie, którym mogę się podzielić. W pracy, nie mam dostępu użytkownika root w systemie Linux, więc zainstalowałem ramy testowej Google pod moim katalogu domowym: ~/usr/gtest/.

Aby zainstalować pakiet w ~ / usr / gtest / jako biblioteki współdzielone, wraz 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, użyj następującego testu.c jako prostego przykładu testowego:

    #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 
EricX
źródło
1
W ostatniej linii pojawia się błąd: / usr / bin / ld: /tmp/cczG727X.o: niezdefiniowane odniesienie do symbolu '_ZN7testing4TestC2Ev'. Naprawiłem to umieszczanie test.cpp przed bibliotekami. ie: g ++ test.cpp -I $ GTEST_HOME / include -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread
user9869932
Jeśli łączysz się z gtest_main ( lgtest_main), nie ma potrzeby definiowania własnego mainw pliku testowym.
Gino Mempin
10

Jeśli korzystasz z CMake, możesz użyć tego, ExternalProject_Addco opisano tutaj .

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

Fraser
źródło
2

Aktualizacja dla Debiana / Ubuntu

Google Mock (package:) google-mocki Google Test (package libgtest-dev:) zostały połączone. Nowy pakiet nosi nazwę googletest. Obie stare nazwy są nadal dostępne w celu zapewnienia kompatybilności wstecznej i są teraz zależne od nowego pakietu googletest.

Tak więc, aby pobrać biblioteki z repozytorium pakietów, możesz wykonać następujące czynności:

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

Następnie możesz utworzyć link przeciwko -lgmock(lub przeciwko, -lgmock_mainjeśli nie używasz niestandardowej metody głównej) i -lpthread. To wystarczyło przynajmniej do korzystania z Google Test w moich przypadkach.

Jeśli chcesz mieć najnowszą wersję Google Test, pobierz ją z github. Następnie kroki są podobne:

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

Jak widać, zmieniła się ścieżka, w której tworzone są biblioteki. Należy pamiętać, że nowa ścieżka może wkrótce być prawidłowa również dla repozytoriów pakietów.

Zamiast ręcznie kopiować biblioteki, możesz użyć sudo make install. Działa „obecnie”, ale należy pamiętać, że w przeszłości nie zawsze działało. Ponadto nie masz kontroli nad lokalizacją docelową podczas korzystania z tego polecenia i możesz nie chcieć zanieczyszczać /usr/lib.

Tomasz
źródło
1

Byłem podobnie rozczarowany tą sytuacją i ostatecznie stworzyłem do tego własne pakiety źródłowe Ubuntu. Te pakiety źródłowe umożliwiają łatwe utworzenie pakietu binarnego. Są one oparte na najnowszym źródle gtest & gmock z tego postu.

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 powiedzieć, że potrzebujesz pewnych wstępnie wymaganych pakietów, w którym to przypadku wystarczy je zainstalować za pomocą apt-get. Poza tym, zbudowane 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 łączenia gtest z twoim testem jednostkowym, upewnij się, że gtest jest dołączony jako pierwszy ( https://bbs.archlinux.org/viewtopic.php?id=156639 ). powszechne łapanie.

Nick Weedon
źródło
Twój pakiet wyświetla mi błędy, kiedy próbuję się skompilować. Jakikolwiek powód, dlaczego ?? oto mój log test.cpp :(. text + 0x57): undefined odwołanie do 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 odniesienie do `testing :: internal :: AssertHelper :: operator = (testing :: Message const &) const '... jest tak długie, że nie mogę opublikować całej rzeczy. Zrobiłem to na zupełnie nowej maszynie wirtualnej Ubuntu 14.04, więc nic więcej nie zostało zainstalowane poza niezbędnymi zależnościami.
ddelnano
@ddelnano Tak, natknąłem się też na ten mały klejnot testowy Google. Najwyraźniej ważna jest kolejność bibliotek współdzielonych. Łącząc gtest z testem jednostkowym, spróbuj umieścić gtest przed innymi bibliotekami. Kiedy napotkałem
Nick Weedon
@ddelnano, również jeśli twój zestaw testów nie ma zdefiniowanego „głównego”, nie zapomnij utworzyć linku do „gtest_main”.
Nick Weedon,
Nie zamieściłem żadnych innych bibliotek. to wszystko, co miałem w swoim 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
nieważne, nie przeczytałem wpisu na blogu, dopóki nie opublikowałem tego komentarza. Teraz wreszcie działa!
ddelnano
1

Na wszelki wypadek, gdyby ktoś inny znalazł się w takiej samej sytuacji jak ja wczoraj (2016-06-22) i również nie udało się z już opublikowanymi podejściami - na Lubuntu 14.04mnie zadziałało, używając 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
Tobias Hermann
źródło
1

Ta odpowiedź od askubuntu zadziałała dla mnie. Wydaje się prostsze niż inne opcje i mniej podatne na błędy, ponieważ używa pakietu libgtest-devdo pobierania źródeł i stamtąd kompilacji: /ubuntu/145887/why-no-library-files-installed-for-google- test? answertab = głosy # tab-top

Proszę odnieść się do tej odpowiedzi, ale jako skrót podaję również kroki tutaj:

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 mogłem gtestbez problemów zbudować projekt, od którego zależy .

jotadepicas
źródło
1

Poniższa metoda pozwala uniknąć ręcznego manipulowania /usr/libkatalogiem, a jednocześnie wymaga minimalnej zmiany w CMakeLists.txtpliku. Pozwala także na czyste odinstalowanie menedżera pakietów libgtest-dev.

Chodzi o to, że kiedy otrzymasz libgtest-devpakiet za pośrednictwem

sudo apt install libgtest-dev

Źródło jest przechowywane w lokalizacji /usr/src/googletest

Możesz po prostu wskazać CMakeLists.txtten katalog, aby mógł znaleźć niezbędne zależności

Wystarczy wymienić FindGTestzadd_subdirectory(/usr/src/googletest gtest)

Na koniec tak powinno wyglądać

add_subdirectory(/usr/src/googletest gtest)
target_link_libraries(your_executable gtest)
Rufus
źródło
0

Spowoduje to zainstalowanie testu Google i biblioteki próbnej w systemie opartym na Ubuntu / Debian:

sudo apt-get install google-mock

Przetestowano w Google Cloud na obrazie opartym na Debianie.

Shubham Chaudhary
źródło
Hmm, nie, myślę, że to tylko instaluje googlemock, ale nie instaluje googletest(gtest). Przynajmniej tak mi się przydarzyło.
jotadepicas
0

Spowoduje to zbudowanie i zainstalowanie zarówno 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
Bl00dh0und
źródło
-1

Dla 1.8.1 na podstawie odpowiedzi @ ManuelSchneid3r musiałem zrobić:

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

Zrobiłem wtedy, make installco wydawało się działać dla 1.8.1, ale śledzenie @ ManuelSchneid3r oznaczałoby:

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/include/gmock /usr/include
sudo cp `find .|grep .so$` /usr/lib/
ntg
źródło
Minęło trochę czasu, kiedy napisałem tę odpowiedź, daj mi znać, w czym jest problem, jeśli uważasz, że nie ma wartości / jest nieważny.
ntg