So richten Sie googleTest als gemeinsam genutzte Bibliothek unter Linux ein

84

Debian bietet keine vorkompilierten Pakete mehr für gTest an. Sie schlagen vor, dass Sie das Framework in das Makefile Ihres Projekts integrieren. Aber ich möchte mein Makefile sauber halten. Wie richte ich gTest wie die früheren Versionen (<1.6.0) ein, damit ich eine Verknüpfung mit der Bibliothek herstellen kann?

ManuelSchneid3r
quelle
2
Übrigens werden gtest-Builds mit Autotools verwaltet, sodass der Standard- ./configure && make && make installWorkflow einwandfrei funktionieren sollte. Ich bin mir nicht sicher, ob dies einen Beitrag rechtfertigt, da es sich nicht von der Kompilierung vieler anderer Pakete aus dem Quellcode unterscheiden würde.
Shawn Chin
7
Ich denke, nicht alle Benutzer sind so erfahren wie Sie. Ich bin kürzlich von Windows zu Linux gekommen und hätte mich gefreut, so etwas auf StackOverflow zu finden.
ManuelSchneid3r
1
Beachten Sie, dass Google empfiehlt, KEINE Bibliothek zu erstellen, sondern den GTest-Code in Ihr Projekt aufzunehmen. Siehe code.google.com/p/googletest/wiki/…
Mawg sagt, Monica
Das ist die erste Note in der Antwort.
ManuelSchneid3r
1
Der von @Mawg bereitgestellte Link ist defekt (das Wiki wurde entfernt), er scheint zu funktionieren, zeigt jedoch auf eine Seite, die nicht mehr zum Thema gehört (ziemlich verwirrend). Das Beste, was ich als Ersatz finden kann, sind die folgenden Build-Anweisungen: github.com/google/googletest/blob/master/googletest/README.md Dies erklärt jedoch nur, wie mit cmake erstellt wird. Für Autotools fand ich die folgende Antwort, um am besten zu funktionieren: stackoverflow.com/a/36000856/1487069
Carlo Wood

Antworten:

142

Bevor Sie beginnen, stellen Sie sicher, dass Sie diesen Hinweis von Google gelesen und verstanden haben ! Dieses Tutorial erleichtert die Verwendung von gtest, kann jedoch böse Fehler verursachen .

1. Holen Sie sich das Googletest-Framework

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

Oder holen Sie es von Hand . Ich werde dieses kleine How-to nicht beibehalten. Wenn Sie also darauf gestoßen sind und die Links veraltet sind, können Sie es jederzeit bearbeiten.

2. Entpacken und erstellen Sie den Google-Test

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

3. "Installieren" Sie die Header und Bibliotheken auf Ihrem System.

Dieser Schritt kann von Distribution zu Distribution unterschiedlich sein. Stellen Sie daher sicher, dass Sie die Header und Bibliotheken in das richtige Verzeichnis kopieren. Ich habe dies erreicht, indem ich überprüft habe, wo sich Debians frühere gtest-Bibliotheken befanden. Aber ich bin mir sicher, dass es dafür bessere Möglichkeiten gibt. Hinweis: make installist gefährlich und wird nicht unterstützt

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

4. Aktualisieren Sie den Cache des Linkers

... und prüfen Sie, ob der GNU Linker die Bibliotheken kennt

sudo ldconfig -v | grep gtest

Wenn die Ausgabe so aussieht:

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

dann ist alles in Ordnung.

gTestframework ist jetzt einsatzbereit. Vergessen Sie nicht, Ihr Projekt mit der Bibliothek zu verknüpfen, indem Sie es -lgtestals Linker-Flag und optional, wenn Sie keine eigene Test-Mainroutine geschrieben haben, als explizites -lgtest_mainFlag festlegen .

Von hier an möchten Sie möglicherweise die Googles- Dokumentation und die alten Dokumente zum Framework aufrufen, um zu erfahren, wie es funktioniert. Viel Spaß beim Codieren!

Bearbeiten: Dies funktioniert auch für OS X! Siehe "So richten Sie googleTest unter OS X ordnungsgemäß ein"

ManuelSchneid3r
quelle
2
Gibt es kein make installZiel, das Sie verwenden können, anstatt die Bibliothek und die Header manuell zu kopieren?
Shawn Chin
13
Zitieren Sie die Ausgabe des Makefiles:'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
ManuelSchneid3r
Wurden die Dateien in der Version 1.8.0 umbenannt? include/gtestSoweit ich das beurteilen kann, gibt es keine .
Nubcake
2
Ihr Beitrag ist veraltet. Bitte nicht irreführen, sudo cp -a libgtest_main.so libgtest.so /usr/lib/funktioniert nicht mehr. Die Datei ist noch nicht einmal da.
Schütze
Ich würde auch gerne wissen, warum Debian eine vorinstallierte gemeinsam genutzte Bibliothek entfernt hat (dies geschah gemäß den Empfehlungen des Upstreams: bugs.debian.org/cgi-bin/bugreport.cgi?bug=802587 ). Der dort angegebene Wiki-Link existiert jedoch nicht mehr. Warum war das so?
Carlo Wood
32

Lassen Sie mich dies speziell für Ubuntu-Benutzer beantworten. Installieren Sie zunächst das Entwicklungspaket gtest.

sudo apt-get install libgtest-dev

Beachten Sie, dass dieses Paket nur Quelldateien installiert. Sie müssen den Code selbst kompilieren, um die erforderlichen Bibliotheksdateien zu erstellen. Diese Quelldateien sollten sich unter / usr / src / gtest befinden. Navigieren Sie zu diesem Ordner und kompilieren Sie die Bibliothek mit cmake:

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

Um nun Ihre Programme zu kompilieren, die gtest verwenden, müssen Sie es verknüpfen mit:

-lgtest -lgtest_main -lpthread

Dies funktionierte perfekt für mich unter Ubuntu 14.04LTS.

amritkrs
quelle
1
Eigentlich müssen Sie Bibliotheken nicht manuell kopieren, dafür gibt es in Makefile ein Ziel. Sie können es einfach so machen: sudo apt-get install cmake # install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install Das sollte erstellt und kopiert werden / usr / local / lib /
Alexander Zinovyev
1
@AlexanderZinovyev Ich erhalte "make: *** Keine Regel, um das Ziel 'installieren' zu lassen. Stop." wenn ich die "sudo make install" ausführe
m4l490n
2
"sudo make install" funktionierte unter Ubuntu 18.04, aber nicht unter Ubuntu 16.04.
Ahmed Nassar
1
@AhmedNassar: "sudo make install" macht genau das Gleiche wie "sudo cp * .a / usr / lib". Wenn die Installationsoption im generierten Makefile nicht verfügbar ist, kopieren Sie sie einfach manuell
amritkrs
Es ist nicht erforderlich, manuell zu arbeiten. Es muss in sudo cp *.a /usr/libOrdnung sein, wenn Sie es einfach neu sudo make installerstellen.
Lingjiankong
26

Ich habe eine Weile gebraucht, um das herauszufinden, da die normale "make install" entfernt wurde und ich cmake nicht benutze. Hier ist meine Erfahrung zu teilen. Bei der Arbeit habe ich unter Linux keinen Root-Zugriff, daher habe ich das Google-Testframework in meinem Home-Verzeichnis installiert:~/usr/gtest/ .

So installieren Sie das Paket in ~ / usr / gtest / als gemeinsam genutzte Bibliotheken zusammen mit dem Beispielbuild:

$ 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

Verwenden Sie zum Überprüfen der Installation die folgende Datei test.c als einfaches Testbeispiel:

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

Kompilieren:

    $ 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
quelle
1
Mit der letzten Zeile erhalte ich die Fehlermeldung: / usr / bin / ld: /tmp/cczG727X.o: undefinierter Verweis auf das Symbol '_ZN7testing4TestC2Ev'. Ich habe diese Platzierung test.cpp vor den Bibliotheken behoben. dh: g ++ test.cpp -I $ GTEST_HOME / include -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread
user9869932
Wenn Sie mit gtest_main ( lgtest_main) verknüpfen , müssen Sie keine eigene mainin der Testdatei definieren .
Gino Mempin
10

Wenn Sie CMake verwenden, können Sie es ExternalProject_Addwie hier beschrieben verwenden .

Auf diese Weise müssen Sie den gtest-Quellcode nicht in Ihrem Repository behalten oder irgendwo installieren. Es wird automatisch heruntergeladen und in Ihren Build-Baum integriert.

Fraser
quelle
2

Update für Debian / Ubuntu

Google Mock (Paket :) google-mockund Google Test (Paket libgtest-dev:) wurden zusammengeführt. Das neue Paket heißt googletest. Beide alten Namen sind aus Gründen der Abwärtskompatibilität weiterhin verfügbar und hängen jetzt vom neuen Paket abgoogletest .

Um Ihre Bibliotheken aus dem Paket-Repository abzurufen, haben Sie folgende Möglichkeiten:

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

Danach können Sie gegen -lgmock(oder gegen, -lgmock_mainwenn Sie keine benutzerdefinierte Hauptmethode verwenden) und-lpthread . Dies war zumindest in meinen Fällen ausreichend, um Google Test zu verwenden.

Wenn Sie die aktuellste Version von Google Test möchten, laden Sie sie von github herunter. Danach sind die Schritte ähnlich:

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

Wie Sie sehen, hat sich der Pfad, in dem die Bibliotheken erstellt werden, geändert. Beachten Sie, dass der neue Pfad möglicherweise auch bald für die Paket-Repositorys gültig ist.

Anstatt die Bibliotheken manuell zu kopieren, können Sie sie auch verwenden sudo make install. Es funktioniert "derzeit", aber beachten Sie, dass es in der Vergangenheit nicht immer funktioniert hat. Außerdem haben Sie bei Verwendung dieses Befehls keine Kontrolle über den Zielspeicherort und möchten möglicherweise keine Verschmutzung verursachen /usr/lib.

Thomas
quelle
1

In ähnlicher Weise war ich von dieser Situation überwältigt und erstellte meine eigenen Ubuntu-Quellpakete dafür. Mit diesen Quellpaketen können Sie auf einfache Weise ein Binärpaket erstellen. Sie basieren auf der neuesten gtest & gmock-Quelle ab diesem Beitrag.

Google Test DEB-Quellpaket

Google Mock DEB-Quellpaket

Gehen Sie folgendermaßen vor, um das Binärpaket zu erstellen:

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

Es kann Ihnen sagen, dass Sie einige vorausgesetzte Pakete benötigen. In diesem Fall müssen Sie sie nur apt-get installieren. Abgesehen davon sollten sich die erstellten .deb-Binärpakete dann im übergeordneten Verzeichnis befinden.

Für GMock ist der Prozess der gleiche.

Nebenbei bemerkt, obwohl nicht spezifisch für meine Quellpakete, stellen Sie beim Verknüpfen von gtest mit Ihrem Komponententest sicher, dass gtest zuerst enthalten ist ( https://bbs.archlinux.org/viewtopic.php?id=156639 ) gemeinsame gotcha.

Nick Weedon
quelle
Ihr Paket gibt mir Fehler, wenn ich versuche zu kompilieren. Irgendein Grund warum? Hier ist mein Protokoll test.cpp :(. text + 0x57): undefinierter Verweis auf 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): undefinierter Verweis auf `testing :: internal :: AssertHelper :: operator = (testing :: Message const &) const '... es ist so lang, dass ich nicht die ganze Sache posten kann. Ich habe dies in einer brandneuen Ubuntu 14.04-VM getan, sodass außer den erforderlichen Abhängigkeiten nichts anderes installiert wurde.
Ddelnano
@ddelnano Ja, ich bin auch auf dieses kleine Google-Testjuwel gestoßen. Anscheinend ist die Reihenfolge der gemeinsam genutzten Bibliotheken wichtig. Wenn Sie gtest mit Ihrem Unit-Test verknüpfen, versuchen Sie, gtest vor anderen Bibliotheken einzuschließen. Als ich auf dieses Problem stieß, löste dieser Link es für mich: bbs.archlinux.org/viewtopic.php?id=156639
Nick Weedon
@ddelnano, auch wenn in Ihrer Testsuite kein 'main' definiert ist, vergessen Sie nicht, einen Link gegen 'gtest_main' zu erstellen.
Nick Weedon
Ich habe keine anderen Bibliotheken aufgenommen. Das ist alles, was ich in meiner Datei hatte #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
Vergiss nicht, dass ich den Blog-Beitrag erst gelesen habe, nachdem ich diesen Kommentar gepostet habe. Es funktioniert jetzt endlich!
Ddelnano
1

Nur für den Fall, dass jemand anderes gestern (22.06.2016) in die gleiche Situation wie ich gerät und auch mit den bereits veröffentlichten Ansätzen keinen Erfolg hat - Lubuntu 14.04es hat bei mir mit der folgenden Befehlskette funktioniert:

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
quelle
1

Diese Antwort von askubuntu hat bei mir funktioniert. Scheint einfacher als andere Optionen und weniger fehleranfällig, da es Pakete verwendet libgtest-dev, um die Quellen und Builds von dort abzurufen: abzurufen /ubuntu/145887/why-no-library-files-installed-for-google- test? answertab = Stimmen # tab-top

Bitte beziehen Sie sich auf diese Antwort, aber nur als Abkürzung gebe ich auch hier die Schritte an:

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/

Danach konnte ich mein Projekt gtestohne Probleme erstellen .

Jotadepicas
quelle
1

Die folgende Methode vermeidet das manuelle Durcheinander mit dem /usr/libVerzeichnis und erfordert nur minimale Änderungen in Ihrer CMakeLists.txtDatei. Außerdem kann Ihr Paketmanager sauber deinstalliert werdenlibgtest-dev .

Die Idee ist, dass, wenn Sie das libgtest-devPaket über erhalten

sudo apt install libgtest-dev

Die Quelle wird vor Ort gespeichert /usr/src/googletest

Sie können einfach CMakeLists.txtauf dieses Verzeichnis verweisen , damit es die erforderlichen Abhängigkeiten findet

Ersetzen Sie einfach FindGTestmitadd_subdirectory(/usr/src/googletest gtest)

Am Ende sollte es so aussehen

add_subdirectory(/usr/src/googletest gtest)
target_link_libraries(your_executable gtest)
Rufus
quelle
0

Dadurch wird die Google Test- und Mock-Bibliothek in einem Ubuntu / Debian-basierten System installiert:

sudo apt-get install google-mock

Getestet in der Google Cloud in einem Debian-basierten Bild.

Shubham Chaudhary
quelle
Hmm, nein, ich denke das wird nur installiert googlemock, aber es wird nicht installiert googletest(gtest). Zumindest ist mir das passiert.
Jotadepicas
0

Dadurch werden sowohl gtest als auch gmock 1.7.0 erstellt und installiert:

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
quelle
-1

Für 1.8.1 basierend auf der Antwort von @ ManuelSchneid3r musste ich Folgendes tun:

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

Ich habe dann das gemacht, make installwas für 1.8.1 zu funktionieren schien, aber nach @ ManuelSchneid3r würde es bedeuten:

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/include/gmock /usr/include
sudo cp `find .|grep .so$` /usr/lib/
ntg
quelle
Es ist eine Weile her, dass ich diese Antwort geschrieben habe. Lassen Sie mich wissen, was das Problem ist, wenn Sie denken, dass es keinen Wert hat / ungültig ist.
ntg