Cómo configurar googleTest como una biblioteca compartida en Linux

87

Debian ya no proporciona ningún paquete precompilado para gTest. Sugieren que integre el marco en el archivo MAKE de su proyecto. Pero quiero mantener limpio mi archivo MAKE. ¿Cómo configuro gTest como las versiones anteriores (<1.6.0), para poder vincularme con la biblioteca?

ManuelSchneid3r
fuente
2
Por cierto, las compilaciones de gtest se administran mediante herramientas automáticas, por lo que el ./configure && make && make installflujo de trabajo estándar debería funcionar bien. No estoy seguro de si esto justifica una publicación, ya que no sería diferente de compilar muchos otros paquetes desde la fuente.
Shawn Chin
7
Supongo que no todos los usuarios tienen tanta experiencia como tú. Recientemente vine de Windows a Linux y me hubiera gustado encontrar algo como esto en StackOverflow.
ManuelSchneid3r
1
Tenga en cuenta que Google recomienda que NO cree una biblioteca, sino que incluya el código GTest en su proyecto. Ver code.google.com/p/googletest/wiki/…
Mawg dice restablecer a Monica
Esa es la primera nota de la respuesta.
ManuelSchneid3r
1
El enlace proporcionado por @Mawg está roto (se eliminó el wiki), parece funcionar pero apunta a una página que ya no está en el tema (bastante confuso). Lo mejor que puedo encontrar como reemplazo son estas instrucciones de compilación: github.com/google/googletest/blob/master/googletest/README.md Sin embargo, eso solo explica cómo compilar con cmake. Para autotools, encontré que la siguiente respuesta funciona mejor: stackoverflow.com/a/36000856/1487069
Carlo Wood

Respuestas:

143

Antes de comenzar, asegúrese de haber leído y comprendido esta nota de Google . Este tutorial facilita el uso de gtest, pero puede introducir errores desagradables .

1. Obtenga el marco de Googletest

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

O consíguelo a mano . No mantendré este pequeño instructivo, por lo que si lo encontró y los enlaces están desactualizados, no dude en editarlo.

2. Desempaquete y compile la prueba de Google

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

3. "Instale" los encabezados y las bibliotecas en su sistema.

Este paso puede diferir de una distribución a otra, así que asegúrese de copiar los encabezados y las bibliotecas en el directorio correcto. Lo logré comprobando dónde se ubicaban las antiguas librerías gtest de Debians . Pero estoy seguro de que hay mejores formas de hacerlo. Nota: make installes peligroso y no es compatible

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

4. Actualiza la caché del vinculador.

... y compruebe si GNU Linker conoce las librerías

sudo ldconfig -v | grep gtest

Si la salida se ve así:

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

entonces todo esta bien.

gTestframework ahora está listo para usar. Simplemente no olvide vincular su proyecto con la biblioteca estableciendo -lgtestcomo indicador de vinculador y, opcionalmente, si no escribió su propia rutina principal de prueba, el -lgtest_mainindicador explícito .

A partir de aquí, es posible que desee ir a la documentación de Google y los documentos antiguos sobre el marco para aprender cómo funciona. ¡Feliz codificación!

Editar: ¡ Esto también funciona para OS X! Consulte "Cómo configurar correctamente googleTest en OS X".

ManuelSchneid3r
fuente
2
¿No hay ningún make installdestino que pueda usar en lugar de copiar manualmente la biblioteca y los encabezados?
Shawn Chin
13
Cita de la salida del archivo MAKE:'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
ManuelSchneid3r
¿Se ha cambiado el nombre de los archivos en la versión 1.8.0? No hay include/gtesthasta donde yo puedo decir.
Nubcake
2
Tu publicación está desactualizada. Por favor, no engañe a la gente, sudo cp -a libgtest_main.so libgtest.so /usr/lib/ya no funciona. Para empezar, el archivo ni siquiera está ahí.
Schütze
También me gustaría saber por qué debian eliminó una biblioteca compartida preinstalada (lo hicieron de acuerdo con las recomendaciones de upstream: bugs.debian.org/cgi-bin/bugreport.cgi?bug=802587 ). Sin embargo, el enlace wiki dado allí ya no existe. Entonces, ¿por qué fue este el caso?
Carlo Wood
33

Déjame responder esto específicamente para usuarios de ubuntu. Primero, comience instalando el paquete de desarrollo gtest.

sudo apt-get install libgtest-dev

Tenga en cuenta que este paquete solo instala archivos fuente. Debe compilar el código usted mismo para crear los archivos de biblioteca necesarios. Estos archivos fuente deben ubicarse en / usr / src / gtest. Busque esta carpeta y use cmake para compilar la biblioteca:

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

Ahora, para compilar sus programas que usan gtest, debe vincularlo con:

-lgtest -lgtest_main -lpthread

Esto funcionó perfectamente para mí en Ubuntu 14.04LTS.

amritkrs
fuente
1
En realidad, no tiene que copiar las bibliotecas manualmente, hay un objetivo para eso en Makefile. Puede hacerlo así: sudo apt-get install cmake # install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install Eso debería ser construido y copiar / usr / local / lib /
Alexander Zinovyev
1
@AlexanderZinovyev Me sale "make: *** No hay regla para hacer que el objetivo 'instale'. Deténgase". cuando ejecuto "sudo make install"
m4l490n
2
"sudo make install" funcionó en Ubuntu 18.04, pero no funcionó en Ubuntu 16.04.
Ahmed Nassar
1
@AhmedNassar: "sudo make install" hace exactamente lo mismo que "sudo cp * .a / usr / lib". Por lo tanto, si la opción de instalación no está disponible en el Makefile generado, simplemente cópielos manualmente
amritkrs
No hay necesidad de hacerlo manualmente sudo cp *.a /usr/lib, simplemente reemplácelo con sudo make installdebería estar bien.
lingjiankong
26

Me tomó un tiempo darme cuenta de esto porque el "make install" normal se ha eliminado y no uso cmake. Aquí está mi experiencia para compartir. En el trabajo, no tengo acceso de root en Linux, así que instalé el marco de prueba de Google en mi directorio de inicio:~/usr/gtest/ .

Para instalar el paquete en ~ / usr / gtest / como bibliotecas compartidas, junto con la compilación de muestra también:

$ 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

Para validar la instalación, use el siguiente test.c como un ejemplo de prueba 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();
    }

Compilar:

    $ 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
fuente
1
Con la última línea obtengo el error: / usr / bin / ld: /tmp/cczG727X.o: referencia indefinida al símbolo '_ZN7testing4TestC2Ev'. Arreglé esto colocando test.cpp antes de las bibliotecas. es decir: g ++ test.cpp -I $ GTEST_HOME / include -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread
user9869932
Si se vincula con gtest_main ( lgtest_main), no es necesario definir el suyo mainen el archivo de prueba.
Gino Mempin
10

Si está usando CMake, puede usarlo ExternalProject_Addcomo se describe aquí .

Esto le evita tener que mantener el código fuente de gtest en su repositorio o instalarlo en cualquier lugar. Se descarga y se integra en su árbol de compilación automáticamente.

Fraser
fuente
2

Actualización para Debian / Ubuntu

Google Mock (paquete:) google-mocky Google Test (paquete:) libgtest-devse han fusionado. El nuevo paquete se llama googletest. Ambos nombres antiguos todavía están disponibles para compatibilidad con versiones anteriores y ahora dependen del nuevo paquete googletest.

Entonces, para obtener sus bibliotecas del repositorio de paquetes, puede hacer lo siguiente:

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

Después de eso, puede vincular contra -lgmock(o en contra -lgmock_mainsi no usa un método principal personalizado) y -lpthread. Esto fue suficiente para usar Google Test en mis casos al menos.

Si desea la versión más actual de Google Test, descárguela de github. Después de eso, los pasos son similares:

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

Como puede ver, la ruta donde se crean las bibliotecas ha cambiado. Tenga en cuenta que la nueva ruta también podría ser válida para los repositorios de paquetes pronto.

En lugar de copiar las bibliotecas manualmente, puede usar sudo make install. Funciona "actualmente", pero tenga en cuenta que no siempre funcionó en el pasado. Además, no tiene control sobre la ubicación de destino cuando usa este comando y es posible que no desee contaminar /usr/lib.

Thomas
fuente
1

De manera similar, esta situación me decepcionó y terminé haciendo mis propios paquetes fuente de Ubuntu para esto. Estos paquetes fuente le permiten producir fácilmente un paquete binario. Se basan en la última fuente de gtest & gmock a partir de esta publicación.

Paquete fuente DEB de prueba de Google

Paquete fuente de Google Mock DEB

Para construir el paquete binario, haga esto:

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

Puede indicarle que necesita algunos paquetes de requisitos previos, en cuyo caso solo necesita apt-get instalarlos. Aparte de eso, los paquetes binarios .deb construidos deberían estar ubicados en el directorio principal.

Para GMock, el proceso es el mismo.

Como nota al margen, aunque no es específico para mis paquetes fuente, cuando vincule gtest a su prueba unitaria, asegúrese de que gtest esté incluido primero ( https://bbs.archlinux.org/viewtopic.php?id=156639 ) Esto parece un gotcha común.

Nick Weedon
fuente
Su paquete me da errores cuando intento compilar. ¿Alguna razón por la que? aquí está mi registro test.cpp :(. texto + 0x57): referencia indefinida a 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): referencia indefinida a `testing :: internal :: AssertHelper :: operator = (testing :: Message const &) const '... es tan largo que no puedo publicar todo. Hice esto en una nueva máquina virtual Ubuntu 14.04, por lo que no se instaló nada más, excepto las dependencias necesarias.
ddelnano
@ddelnano Sí, también me encontré con esta pequeña joya de prueba de Google. Aparentemente, el orden de las bibliotecas compartidas es importante. Cuando vincule gtest a su prueba unitaria, intente incluir gtest antes que otras bibliotecas. Cuando encontré
Nick Weedon
@ddelnano, también si su suite de prueba no tiene un 'main' definido, no olvide vincularlo con 'gtest_main'.
Nick Weedon
No incluí ninguna otra biblioteca. esto es todo lo que tenía en mi archivo #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
no importa, no leí la publicación del blog hasta después de publicar ese comentario. ¡Ahora finalmente está funcionando!
ddelnano
1

En caso de que alguien más se ponga en la misma situación que yo ayer (2016-06-22) y tampoco tenga éxito con los enfoques ya publicados Lubuntu 14.04, funcionó para mí usando la siguiente cadena de comandos:

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

Esta respuesta de askubuntu es lo que funcionó para mí. Parece más simple que otras opciones y menos propenso a errores, ya que usa el paquete libgtest-devpara obtener las fuentes y compila desde allí: /ubuntu/145887/why-no-library-files-installed-for-google- test? answertab = votes # tab-top

Consulte esa respuesta, pero solo como un atajo, proporciono los pasos aquí también:

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/

Después de eso, pude construir mi proyecto que depende gtestsin problemas.

jotadepicas
fuente
1

El siguiente método evita jugar manualmente con el /usr/libdirectorio y al mismo tiempo requiere un cambio mínimo en su CMakeLists.txtarchivo. También permite que su administrador de paquetes se desinstale limpiamentelibgtest-dev .

La idea es que cuando reciba el libgtest-devpaquete a través de

sudo apt install libgtest-dev

La fuente se almacena en la ubicación /usr/src/googletest

Simplemente puede apuntar CMakeLists.txta ese directorio para que pueda encontrar las dependencias necesarias

Simplemente reemplace FindGTestconadd_subdirectory(/usr/src/googletest gtest)

Al final, debería verse así

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

Esto instalará la biblioteca de prueba y simulación de Google en el sistema basado en Ubuntu / Debian:

sudo apt-get install google-mock

Probado en la nube de Google en una imagen basada en Debian.

Shubham Chaudhary
fuente
Hmm, no, creo que esto solo se instala googlemock, pero no se instala googletest(gtest). Al menos eso es lo que me pasó.
jotadepicas
0

Esto compilará e instalará tanto gtest como 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
fuente
-1

Para 1.8.1 basado en la respuesta de @ ManuelSchneid3r, tuve que hacer:

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

Luego hice lo make installque parecía funcionar para 1.8.1, pero siguiendo a @ ManuelSchneid3r significaría:

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/include/gmock /usr/include
sudo cp `find .|grep .so$` /usr/lib/
ntg
fuente
Ha pasado un tiempo desde que escribí esta respuesta, avíseme cuál es el problema si cree que no tiene valor / no es válida.
2019