web-dev-qa-db-fra.com

Comment installer google-mock sur Ubuntu 12.10

J'ai de la difficulté à installer Google C++ Mocking Framework. J'ai réussi à exécuter Sudo apt-get install google-mock. Ensuite, j'ai essayé de compiler cet exemple de fichier

#include "gmock/gmock.h"
int main(int argc, char** argv) {
  ::testing::InitGoogleMock(&argc, argv);
  return RUN_ALL_TESTS();
}

avec g++ -lgmock main.cpp et ces erreurs ont montré

main.cpp:(.text+0x1e): undefined reference to `testing::InitGoogleMock(int*, char**)'
main.cpp:(.text+0x23): undefined reference to `testing::UnitTest::GetInstance()'
main.cpp:(.text+0x2b): undefined reference to `testing::UnitTest::Run()'
collect2: error: ld returned 1 exit status

Je suppose que l'éditeur de liens ne peut pas trouver les fichiers de la bibliothèque. Est-ce que quelqu'un sait comment réparer ceci?

5
Slazer

OK, j’ai commencé à utiliser gmock avec succès en construisant ma propre version selon le README fourni avec le téléchargement du code source à partir du site Web du projet googlemock.

Obtenez le fichier Zip à télécharger sur le site Web: http://code.google.com/p/googlemock/downloads/list

Décompressez ceci dans un répertoire, dites ${GMOCK_ROOT}. Ensuite, conformément aux instructions README :

cd ${GMOCK_ROOT}
mkdir build
cd build
g++ -I../gtest/include -I../gtest -I../include -I.. -c ../gtest/src/gtest-all.cc
g++ -I../gtest/include -I../gtest -I../include -I.. -c ../src/gmock-all.cc
ar -rv libgmock.a gtest-all.o gmock-all.o

Ainsi, vous avez votre propre libgmock.a dans ${GMOCK_ROOT}/build. En fait, vous avez également besoin de pthreads pour compiler, ainsi votre commande de compilation devient:

g++ -I${GMOCK_ROOT}/include/ main.cpp -L${GMOCK_ROOT}/build -lgmock -lpthread
7
Pavel

libgmock-dev sera inclus dans les référentiels Ubuntu 18.10 par défaut. Sinon, dans les versions précédentes d'Ubuntu, vous devez le télécharger et l'installer manuellement.

Sudo apt-get install libgmock-dev
cd /usr/src/gmock
Sudo mkdir build
Sudo cmake ..
Sudo make
Sudo cp *.a /usr/lib
3
Steephen

Pour mettre en contexte la réponse de Pavel, le fichier binaire Google Mock compilé n'est pas distribué avec le paquet Ubuntu pour la raison indiquée ici . Cette explication concerne Google Test, mais le principe s’applique à n’importe quelle bibliothèque C++.

Plus précisément, il est écrit:

Dans les premiers temps, nous avions indiqué que vous pouviez installer des bibliothèques Google Test compilées sur des systèmes * nix à l'aide de make install. Chaque utilisateur de votre ordinateur peut alors écrire des tests sans recompiler Google Test.

Cela semblait être une bonne idée, mais il a un got-cha: chaque utilisateur doit compiler ses tests en utilisant les mêmes indicateurs de compilateur que ceux utilisés pour compiler les bibliothèques Google Test installées; sinon, il risque de rencontrer des comportements indéfinis (c’est-à-dire que les tests peuvent se comporter de manière étrange et peuvent même échouer sans raison évidente).

Pourquoi? Parce que C++ a ce qu'on appelle la règle de définition unique: si deux fichiers source C++ contiennent des définitions différentes de la même classe/fonction/variable et que vous les liez ensemble, vous ne respectez pas la règle. L'éditeur de liens peut ou ne peut pas détecter l'erreur (dans de nombreux cas, le standard C++ n'impose pas d'attraper la violation). Si ce n'est pas le cas, vous obtenez des comportements d'exécution étranges, inattendus et difficiles à déboguer.

Si vous compilez Google Test et votre code de test à l'aide de différents indicateurs de compilateur, ils risquent de voir différentes définitions de la même classe/fonction/variable (en raison, par exemple, de l'utilisation de #if dans Google Test). Par conséquent, pour des raisons de sécurité, nous vous recommandons d'éviter d'installer des bibliothèques Google Test pré-compilées. Au lieu de cela, chaque projet doit compiler Google Test lui-même de manière à pouvoir être sûr que les mêmes indicateurs sont utilisés à la fois pour Google Test et les tests.

Donc, votre problème initial était dû au fait que l'installation du paquetage google-mock installait uniquement le code source, et lorsque vous avez essayé de compiler votre exemple d'application, aucune bibliothèque gmock n'a pu être trouvée.

2
user2405