Como configurar o googleTest como uma biblioteca compartilhada no Linux

87

O Debian não fornece mais nenhum pacote pré-compilado para o gTest. Eles sugerem que você integre a estrutura no makefile do seu projeto. Mas eu quero manter meu makefile limpo. Como faço para configurar gTest como as versões anteriores (<1.6.0), para que eu possa vincular à biblioteca?

ManuelSchneid3r
fonte
2
BTW, as compilações gtest são gerenciadas usando autotools, portanto, o ./configure && make && make installfluxo de trabalho padrão deve funcionar bem. Não tenho certeza se isso justifica um post, já que não seria diferente de compilar muitos outros pacotes do código-fonte.
Shawn Chin
7
Acho que nem todos os usuários são tão experientes quanto você. Recentemente, vim do Windows para o Linux e ficaria feliz em encontrar algo assim no StackOverflow.
ManuelSchneid3r
1
Observe que o Google recomenda que você NÃO crie uma biblioteca, mas inclua o código GTest em seu projeto. Consulte code.google.com/p/googletest/wiki/…
Mawg diz reintegrar Monica em
Essa é a primeira nota na resposta.
ManuelSchneid3r
1
O link fornecido por @Mawg está quebrado (o wiki foi removido), parece funcionar, mas aponta para uma página que não está mais no tópico (bastante confusa). O melhor que posso encontrar como substituição são estas instruções de construção: github.com/google/googletest/blob/master/googletest/README.md No entanto, isso apenas explica como construir com cmake. Para ferramentas automáticas, descobri que a seguinte resposta funciona melhor: stackoverflow.com/a/36000856/1487069
Carlo Wood

Respostas:

143

Antes de começar, certifique-se de ler e compreender esta nota do Google ! Este tutorial torna o uso do gtest fácil, mas pode apresentar bugs desagradáveis .

1. Obtenha a estrutura googletest

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

Ou pegue manualmente . Não vou manter este pequeno manual, então se você topou com ele e os links estão desatualizados, fique à vontade para editá-lo.

2. Descompacte e crie o teste do Google

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

3. "Instale" os cabeçalhos e libs em seu sistema.

Esta etapa pode ser diferente de uma distro para outra, portanto, certifique-se de copiar os cabeçalhos e as bibliotecas no diretório correto. Eu fiz isso verificando onde as bibliotecas gtest anteriores do Debians estavam localizadas. Mas tenho certeza de que existem maneiras melhores de fazer isso. Nota: make installé perigoso e não é compatível

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

4. Atualize o cache do vinculador

... e verifique se o GNU Linker conhece as bibliotecas

sudo ldconfig -v | grep gtest

Se a saída for assim:

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

então está tudo bem.

gTestframework agora está pronto para uso. Apenas não se esqueça de vincular seu projeto à biblioteca definindo -lgtestcomo sinalizador de vinculador e, opcionalmente, se você não escreveu sua própria rotina de teste, o -lgtest_mainsinalizador explícito .

Daqui em diante, você pode querer ir para a documentação do Googles e os documentos antigos sobre a estrutura para aprender como ela funciona. Boa codificação!

Edit: Isso funciona para OS X também! Consulte "Como configurar corretamente o googleTest no OS X"

ManuelSchneid3r
fonte
2
Não há um make installdestino que você possa usar em vez de copiar manualmente a biblioteca e os cabeçalhos?
Shawn Chin
13
Citação da saída do makefile:'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
ManuelSchneid3r
Os arquivos foram renomeados na versão 1.8.0? Não há include/gtest, tanto quanto posso dizer.
Nubcake
2
Sua postagem está desatualizada. Por favor, não engane as pessoas, sudo cp -a libgtest_main.so libgtest.so /usr/lib/não funciona mais. O arquivo nem está lá para começar.
Schütze
Eu também gostaria de saber por que o debian removeu uma biblioteca compartilhada pré-instalada (eles fizeram isso de acordo com as recomendações do upstreams: bugs.debian.org/cgi-bin/bugreport.cgi?bug=802587 ). O link da wiki fornecido não existe mais. Então, por que foi esse o caso?
Carlo Wood
33

Deixe-me responder especificamente para usuários do Ubuntu. Comece instalando o pacote de desenvolvimento gtest.

sudo apt-get install libgtest-dev

Observe que este pacote instala apenas arquivos de origem. Você mesmo precisa compilar o código para criar os arquivos de biblioteca necessários. Esses arquivos de origem devem estar localizados em / usr / src / gtest. Navegue até esta pasta e use cmake para compilar a biblioteca:

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

Agora, para compilar seus programas que usam gtest, você deve vinculá-lo a:

-lgtest -lgtest_main -lpthread

Isso funcionou perfeitamente para mim no Ubuntu 14.04LTS.

amritkrs
fonte
1
Na verdade, você não precisa copiar as bibliotecas manualmente, existe um destino para isso no Makefile. Você pode simplesmente fazer assim: sudo apt-get install cmake # install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install Isso deve ser compilado e copiar / usr / local / lib /
Alexander Zinovyev
1
@AlexanderZinovyev Recebo "make: *** Nenhuma regra para tornar o destino 'instalar'. Pare." quando executo o "sudo make install"
m4l490n
2
"sudo make install" funcionava no Ubuntu 18.04, mas não funcionava no Ubuntu 16.04.
Ahmed Nassar
1
@AhmedNassar: "sudo make install" faz exatamente a mesma coisa que "sudo cp * .a / usr / lib". Portanto, se a opção de instalação não estiver disponível no Makefile gerado, basta copiá-los manualmente
amritkrs de
Não há necessidade de fazer manualmente sudo cp *.a /usr/lib, apenas repalcá-lo com sudo make installdeve estar bem.
lingjiankong
26

Levei um tempo para descobrir isso porque o "make install" normal foi removido e eu não uso o cmake. Aqui está minha experiência para compartilhar. No trabalho, eu não tenho acesso root no Linux, então eu instalei a estrutura de teste Google sob meu diretório home: ~/usr/gtest/.

Para instalar o pacote em ~ / usr / gtest / as bibliotecas compartilhadas, junto com a compilação de amostra também:

$ 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 a instalação, use o seguinte test.c como um exemplo de teste simples:

    #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
fonte
1
Com a última linha, recebo o erro: / usr / bin / ld: /tmp/cczG727X.o: referência indefinida ao símbolo '_ZN7testing4TestC2Ev'. Consertei isso colocando test.cpp antes das bibliotecas. isto é: g ++ test.cpp -I $ GTEST_HOME / include -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread
user9869932
Se vincular a gtest_main ( lgtest_main), não há necessidade de definir o seu próprio mainno arquivo de teste.
Gino Mempin
10

Se você estiver usando o CMake, pode usar ExternalProject_Addconforme descrito aqui .

Isso evita que você tenha que manter o código-fonte do gtest em seu repositório ou instalá-lo em qualquer lugar. Ele é baixado e construído em sua árvore de construção automaticamente.

Fraser
fonte
2

Atualização para Debian / Ubuntu

O Google Mock (pacote:) google-mocke o Google Test (pacote libgtest-dev:) foram mesclados. O novo pacote é chamado googletest. Ambos os nomes antigos ainda estão disponíveis para compatibilidade com versões anteriores e agora dependem do novo pacotegoogletest .

Portanto, para obter suas bibliotecas do repositório de pacotes, você pode fazer o seguinte:

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

Depois disso, você pode criar um link contra -lgmock(ou contra, -lgmock_mainse não usar um método principal personalizado) e-lpthread . Isso foi suficiente para usar o Google Test em meus casos, pelo menos.

Se você deseja a versão mais atual do Google Test, faça o download no github. Depois disso, as etapas são semelhantes:

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 você pode ver, o caminho onde as bibliotecas são criadas mudou. Lembre-se de que o novo caminho também pode ser válido para os repositórios de pacotes em breve.

Em vez de copiar as bibliotecas manualmente, você pode usar sudo make install. Ele "atualmente" funciona, mas esteja ciente de que nem sempre funcionou no passado. Além disso, você não tem controle sobre o local de destino ao usar este comando e pode não querer poluir /usr/lib.

Thomas
fonte
1

Eu também fiquei impressionado com esta situação e acabei fazendo meus próprios pacotes fonte do Ubuntu para isso. Esses pacotes fonte permitem que você produza facilmente um pacote binário. Eles são baseados na fonte gtest & gmock mais recente a partir desta postagem.

Pacote de origem de DEB de teste do Google

Pacote de origem do Google Mock DEB

Para construir o pacote binário, faça o seguinte:

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

Isso pode lhe dizer que você precisa de alguns pacotes de pré-requisitos, nesse caso você só precisa fazer o apt-get instalá-los. Além disso, os pacotes binários .deb construídos devem estar no diretório pai.

Para GMock, o processo é o mesmo.

Como uma observação lateral, embora não seja específico para meus pacotes de origem, ao vincular gtest ao seu teste de unidade, certifique-se de que gtest seja incluído primeiro ( https://bbs.archlinux.org/viewtopic.php?id=156639 ) Isso parece um peguei comum.

Nick Weedon
fonte
Seu pacote me dá erros quando tento compilar. Alguma razão? aqui está meu log test.cpp :(. text + 0x57): referência indefinida para testing::Message::Message()' test.cpp:(.text+0x84): undefined reference to testing :: internal :: AssertHelper :: AssertHelper (testing :: TestPartResult :: Type, char const *, int, char const *) 'teste. cpp :(. text + 0x97): referência indefinida para `testing :: internal :: AssertHelper :: operator = (testing :: Message const &) const '... é tão longo que não consigo postar tudo. Fiz isso em uma VM Ubuntu 14.04 totalmente nova, de modo que nada mais foi instalado, exceto as dependências necessárias.
ddelnano
@ddelnano Sim, também encontrei esta pequena joia de teste do Google. Aparentemente, a ordem das bibliotecas compartilhadas é importante. Ao vincular gtest ao seu teste de unidade, tente incluir gtest antes de outras bibliotecas. Quando me deparei com
Nick Weedon
@ddelnano, também se o seu conjunto de testes não tiver um 'principal' definido, não se esqueça de vincular 'gtest_main'.
Nick Weedon,
Não incluí nenhuma outra biblioteca. isso é tudo que eu tinha em meu arquivo #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
deixa pra lá Eu não li a postagem do blog até depois de postar aquele comentário. Agora finalmente está funcionando!
ddelnano
1

Apenas no caso de outra pessoa ficar na mesma situação que eu ontem (2016-06-22) e também não ter sucesso com as abordagens já postadas - Lubuntu 14.04funcionou para mim usando a seguinte cadeia 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
fonte
1

Esta resposta do askubuntu é o que funcionou para mim. Parece mais simples do que outras opções e menos sujeito a erros, pois usa o pacote libgtest-devpara obter os códigos- fonte e compilações a partir daí: /ubuntu/145887/why-no-library-files-installed-for-google- test? answersertab = votes # tab-top

Consulte essa resposta, mas apenas como um atalho, forneço as etapas aqui também:

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/

Depois disso, pude construir meu projeto que depende gtestsem problemas.

jotadepicas
fonte
1

O método a seguir evita bagunçar manualmente o /usr/libdiretório, ao mesmo tempo em que exige mudanças mínimas em seu CMakeLists.txtarquivo. Ele também permite que seu gerenciador de pacotes desinstale de forma limpalibgtest-dev .

A ideia é que quando você receber o libgtest-devpacote via

sudo apt install libgtest-dev

A fonte é armazenada no local /usr/src/googletest

Você pode simplesmente apontar seu CMakeLists.txt para esse diretório para que ele possa encontrar as dependências necessárias

Simplesmente substitua FindGTestporadd_subdirectory(/usr/src/googletest gtest)

No final, deve ser assim

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

Isso instalará o teste do Google e a biblioteca simulada no sistema baseado em Ubuntu / Debian:

sudo apt-get install google-mock

Testado na nuvem do google em imagem baseada em debian.

Shubham Chaudhary
fonte
Hmm, não, acho que só instala googlemock, mas não instala googletest(gtest). Pelo menos foi o que aconteceu comigo.
jotadepicas
0

Isso irá construir e instalar o gtest e o 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
fonte
-1

Para 1.8.1 baseado na resposta de @ ManuelSchneid3r tive que fazer:

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

Então fiz o make installque parecia funcionar para 1.8.1, mas seguir @ ManuelSchneid3r significaria:

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/include/gmock /usr/include
sudo cp `find .|grep .so$` /usr/lib/
ntg
fonte
Já faz um tempo que eu escrevi esta resposta, deixe-me saber qual é o problema com ela se você acha que ela não tem valor / é inválida.
ntg