Comment configurer googleTest en tant que bibliothèque partagée sous Linux


87

Debian ne fournit plus de paquet précompilé pour gTest. Ils vous suggèrent d'intégrer le framework dans le makefile de votre projet. Mais je veux garder mon makefile propre. Comment configurer gTest comme les anciennes versions (<1.6.0), afin de pouvoir créer un lien avec la bibliothèque?


2
BTW, les builds gtest sont gérés à l'aide d'outils automatiques, de sorte que le ./configure && make && make installflux de travail standard devrait fonctionner correctement . Je ne sais pas si cela justifie un article car ce ne serait pas différent de la compilation de nombreux autres paquets à partir des sources.
Shawn Chin du

7
Je suppose que tous les utilisateurs ne sont pas aussi expérimentés que vous. Je suis récemment passé de Windows à Linux et j'aurais été heureux de trouver quelque chose comme ça sur StackOverflow.
ManuelSchneid3r

1
Notez que Google vous recommande de NE PAS créer de bibliothèque, mais d'inclure plutôt le code GTest dans votre projet. Voir code.google.com/p/googletest/wiki/…
Mawg dit de réintégrer Monica

C'est la première note de la réponse.
ManuelSchneid3r

1
Le lien fourni par @Mawg est cassé (le wiki a été supprimé), il semble fonctionner mais pointe vers une page qui n'est plus sur le sujet (assez déroutant). Le meilleur que je puisse trouver en remplacement sont ces instructions de construction: github.com/google/googletest/blob/master/googletest/README.md Cependant, cela explique seulement comment construire avec cmake. Pour les outils automatiques, j'ai trouvé que la réponse suivante fonctionnait le mieux: stackoverflow.com/a/36000856/1487069
Carlo Wood

Réponses:


143

Avant de commencer, assurez-vous d'avoir lu et compris cette note de Google ! Ce tutoriel facilite l'utilisation de gtest, mais peut introduire des bugs désagréables .

1. Obtenez le framework googletest

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

Ou obtenez-le à la main . Je ne maintiendrai pas ce petit guide pratique, donc si vous êtes tombé dessus et que les liens sont obsolètes, n'hésitez pas à le modifier.

2. Décompressez et construisez google test

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

3. "Installez" les en-têtes et les bibliothèques sur votre système.

Cette étape peut différer d'une distribution à l'autre, assurez-vous donc de copier les en-têtes et les bibliothèques dans le bon répertoire. J'ai accompli cela en vérifiant où se trouvaient les anciennes bibliothèques gtest de Debians . Mais je suis sûr qu'il existe de meilleures façons de le faire. Remarque: make installest dangereux et non pris en charge

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

4. Mettez à jour le cache de l'éditeur de liens

... et vérifiez si GNU Linker connaît les bibliothèques

sudo ldconfig -v | grep gtest

Si la sortie ressemble à ceci:

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

alors tout va bien.

gTestframework est maintenant prêt à être utilisé. N'oubliez pas de lier votre projet à la bibliothèque en définissant -lgtestcomme indicateur de l'éditeur de liens et éventuellement, si vous n'avez pas écrit votre propre programme principal de test, l' -lgtest_mainindicateur explicite .

À partir de là, vous voudrez peut-être accéder à la documentation de Google et aux anciens documents sur le framework pour savoir comment cela fonctionne. Bon codage!

Edit: Cela fonctionne aussi pour OS X! Voir "Comment configurer correctement googleTest sur OS X"


2
N'y a-t-il pas de make installcible que vous pouvez utiliser au lieu de copier manuellement la bibliothèque et les en-têtes?
Shawn Chin

13
Cite de la sortie du makefile:'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
ManuelSchneid3r

Les fichiers ont-ils été renommés dans la version 1.8.0? Il n'y a pas include/gtestpour autant que je sache.
Nubcake

2
Votre message est obsolète. Veuillez ne pas induire les gens en erreur, sudo cp -a libgtest_main.so libgtest.so /usr/lib/cela ne fonctionne plus. Le fichier n'est même pas là pour commencer.
Schütze

J'aimerais aussi savoir pourquoi Debian a supprimé une bibliothèque partagée préinstallée (ils l'ont fait selon les recommandations en amont: bugs.debian.org/cgi-bin/bugreport.cgi?bug=802587 ). Le lien wiki qui y est donné n'existe cependant plus. Alors pourquoi était-ce le cas?
Carlo Wood

33

Permettez-moi de répondre à cette question spécifiquement pour les utilisateurs d'ubuntu. Commencez par installer le package de développement gtest.

sudo apt-get install libgtest-dev

Notez que ce package installe uniquement les fichiers source. Vous devez compiler le code vous-même pour créer les fichiers de bibliothèque nécessaires. Ces fichiers source doivent être situés dans / usr / src / gtest. Accédez à ce dossier et utilisez cmake pour compiler la bibliothèque:

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

Maintenant, pour compiler vos programmes qui utilisent gtest, vous devez le lier avec:

-lgtest -lgtest_main -lpthread

Cela a parfaitement fonctionné pour moi sur Ubuntu 14.04LTS.


1
En fait, vous n'avez pas à copier les bibliothèques manuellement, il existe une cible pour cela dans Makefile. Vous pouvez simplement le faire comme ça: sudo apt-get install cmake # install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install Cela devrait être compilé et copié / usr / local / lib /
Alexander Zinovyev

1
@AlexanderZinovyev J'obtiens "make: *** Aucune règle pour que la cible" installe ". Arrêtez." quand
j'exécute

2
"sudo make install" fonctionnait sur Ubuntu 18.04, mais ne fonctionnait pas sur Ubuntu 16.04.
Ahmed Nassar

1
@AhmedNassar: "sudo make install" fait exactement la même chose que "sudo cp * .a / usr / lib". Donc, si l'option d'installation n'est pas disponible dans le Makefile généré, il vous suffit de les copier manuellement
amritkrs

Il n'est pas nécessaire de sudo cp *.a /usr/libprocéder manuellement , il suffit de le repalonner avec sudo make installdevrait être bien.
lingjiankong

26

Il m'a fallu un certain temps pour comprendre cela car le "make install" normal a été supprimé et je n'utilise pas cmake. Voici mon expérience à partager. Au travail, je n'ai pas accès root sur Linux, donc j'ai installé le framework de test Google sous mon répertoire personnel: ~/usr/gtest/.

Pour installer le package dans ~ / usr / gtest / en tant que bibliothèques partagées, avec un exemple de build également:

$ 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

Pour valider l'installation, utilisez le test.c suivant comme exemple de test simple:

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

Compiler:

    $ 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
Avec la dernière ligne, j'obtiens l'erreur: / usr / bin / ld: /tmp/cczG727X.o: référence non définie au symbole '_ZN7testing4TestC2Ev'. J'ai corrigé ce placement test.cpp avant les bibliothèques. ie: g ++ test.cpp -I $ GTEST_HOME / include -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread
user9869932

En cas de liaison avec gtest_main ( lgtest_main), il n'est pas nécessaire de définir le vôtre maindans le fichier de test.
Gino Mempin

10

Si vous utilisez CMake, vous pouvez l'utiliser ExternalProject_Addcomme décrit ici .

Cela vous évite d'avoir à conserver le code source gtest dans votre référentiel ou à l'installer n'importe où. Il est téléchargé et intégré automatiquement dans votre arborescence de construction.


2

Mise à jour pour Debian / Ubuntu

Google Mock (package :) google-mocket Google Test (package:) libgtest-devont été fusionnés. Le nouveau package est appelé googletest. Les deux anciens noms sont toujours disponibles pour des raisons de compatibilité ascendante et dépendent désormais du nouveau package googletest.

Ainsi, pour obtenir vos bibliothèques à partir du référentiel de packages, vous pouvez effectuer les opérations suivantes:

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

Après cela, vous pouvez créer un lien vers -lgmock(ou contre -lgmock_mainsi vous n'utilisez pas de méthode principale personnalisée) et -lpthread. C'était suffisant pour utiliser Google Test dans mes cas au moins.

Si vous voulez la version la plus récente de Google Test, téléchargez-la depuis github. Après cela, les étapes sont similaires:

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

Comme vous pouvez le voir, le chemin où les bibliothèques sont créées a changé. Gardez à l'esprit que le nouveau chemin pourrait également être bientôt valide pour les référentiels de packages.

Au lieu de copier les bibliothèques manuellement, vous pouvez utiliser sudo make install. Cela fonctionne "actuellement", mais sachez que cela n'a pas toujours fonctionné dans le passé. De plus, vous ne contrôlez pas l'emplacement cible lorsque vous utilisez cette commande et vous ne voudrez peut-être pas polluer /usr/lib.


1

J'ai été également déçu par cette situation et j'ai fini par créer mes propres packages sources Ubuntu pour cela. Ces packages sources vous permettent de produire facilement un package binaire. Ils sont basés sur la dernière source gtest & gmock de ce post.

Package source Google Test DEB

Package source Google Mock DEB

Pour créer le package binaire, procédez comme suit:

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

Cela peut vous dire que vous avez besoin de certains paquets pré-requis, auquel cas il vous suffit de les installer par apt-get. En dehors de cela, les paquets binaires .deb construits devraient alors se trouver dans le répertoire parent.

Pour GMock, le processus est le même.

En remarque, bien que cela ne soit pas spécifique à mes paquets sources, lorsque vous liez gtest à votre test unitaire, assurez-vous que gtest est inclus en premier ( https://bbs.archlinux.org/viewtopic.php?id=156639 ) Cela ressemble à un gotcha commun.


Votre package me donne des erreurs lorsque j'essaye de compiler. Une raison pour laquelle ?? voici mon journal test.cpp :(. text + 0x57): référence non définie à 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): référence indéfinie à `testing :: internal :: AssertHelper :: operator = (testing :: Message const &) const '... c'est si long que je ne peux pas poster le tout. Je l'ai fait dans une toute nouvelle VM Ubuntu 14.04, donc rien d'autre n'a été installé à l'exception des dépendances nécessaires.
ddelnano

@ddelnano Oui, je suis tombé sur ce petit bijou de test google aussi. Apparemment, l'ordre des bibliothèques partagées est important. Lors de la liaison de gtest à votre test unitaire, essayez d'inclure gtest avant les autres bibliothèques. Quand j'ai rencontré ce problème, ce lien l'a résolu pour moi: bbs.archlinux.org/viewtopic.php?id=156639
Nick Weedon

@ddelnano, également si votre suite de tests n'a pas de «main» défini, n'oubliez pas de faire un lien avec «gtest_main».
Nick Weedon

Je n'ai inclus aucune autre bibliothèque. c'est tout ce que j'avais dans mon fichier #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

peu importe, je n'ai lu le billet de blog qu'après avoir publié ce commentaire. Cela fonctionne enfin!
ddelnano

1

Juste au cas où quelqu'un d'autre se retrouverait dans la même situation que moi hier (22/06/2016) et ne réussirait pas non plus avec les approches déjà publiées - Lubuntu 14.04cela a fonctionné pour moi en utilisant la chaîne de commandes suivante:

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

Cette réponse de askubuntu est ce qui a fonctionné pour moi. Cela semble plus simple que les autres options et moins sujet aux erreurs, car il utilise un package libgtest-devpour obtenir les sources et les builds à partir de là: /ubuntu/145887/why-no-library-files-installed-for-google- test? answertab = votes # tab-top

Veuillez vous référer à cette réponse, mais juste comme raccourci, je fournis les étapes ici aussi:

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/

Après cela, je pourrais construire mon projet qui dépend de gtestsans aucun problème.


1

La méthode suivante évite de manipuler manuellement le /usr/librépertoire tout en nécessitant une modification minimale de votre CMakeLists.txtfichier. Il permet également à votre gestionnaire de packages de se désinstaller proprement libgtest-dev.

L'idée est que lorsque vous recevez le libgtest-devcolis via

sudo apt install libgtest-dev

La source est stockée dans l'emplacement /usr/src/googletest

Vous pouvez simplement pointer votre CMakeLists.txtvers ce répertoire afin qu'il puisse trouver les dépendances nécessaires

Remplacez simplement FindGTestparadd_subdirectory(/usr/src/googletest gtest)

À la fin, ça devrait ressembler à ça

add_subdirectory(/usr/src/googletest gtest)
target_link_libraries(your_executable gtest)

0

Cela installera google test et mock library dans le système basé sur Ubuntu / Debian:

sudo apt-get install google-mock

Testé dans Google Cloud dans une image basée sur Debian.


Hmm, non, je pense que cela installe seulement googlemock, mais il ne s'installe pas googletest(gtest). Du moins c'est ce qui m'est arrivé.
jotadepicas

0

Cela construira et installera à la fois gtest et 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

Pour la version 1.8.1 basée sur la réponse de @ ManuelSchneid3r, je devais faire:

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

J'ai ensuite fait make installce qui semblait fonctionner pour la version 1.8.1, mais en suivant @ ManuelSchneid3r, cela signifierait:

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/include/gmock /usr/include
sudo cp `find .|grep .so$` /usr/lib/

Cela fait un moment que j'ai écrit cette réponse, faites-moi savoir quel est le problème avec elle si vous pensez qu'elle n'a aucune valeur / n'est pas valide.
ntg
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.