GoogleTest, Linux'ta paylaşılan bir kitaplık olarak nasıl kurulur?


89

Debian artık gTest için önceden derlenmiş paketler sağlamamaktadır. Çerçeveyi projenizin makefile'ına entegre etmenizi önerirler. Ama makefile'ımı temiz tutmak istiyorum. Önceki sürümler (<1.6.0) gibi gTest'i nasıl kurarım, böylece kitaplığa bağlanabilirim?


2
BTW, gtest derlemeleri otomatik araçlar kullanılarak yönetilir, bu nedenle standart ./configure && make && make installiş akışı iyi çalışmalıdır. Diğer birçok paketi kaynaktan derlemekten farklı olmayacağından, bunun bir gönderiyi garanti edip etmediğinden emin değilim.
Shawn Çene

7
Sanırım tüm kullanıcılar sizin kadar deneyimli değil. Yakın zamanda Windows'tan Linux'a geldim ve StackOverflow'da buna benzer bir şey bulduğum için mutlu olurdum.
ManuelSchneid3r

2
Google'ın bir kitaplık OLUŞTURMAMANIZI, bunun yerine projenize GTest kodunu dahil etmenizi önerdiğini unutmayın. Bkz code.google.com/p/googletest/wiki/...
Mawg yeniden aktifleştirme Monica diyor

Cevabın ilk notu bu.
ManuelSchneid3r

1
@Mawg tarafından sağlanan bağlantı koptu (wiki kaldırıldı), çalışıyor gibi görünüyor ama artık konu dışı (oldukça kafa karıştırıcı) bir sayfaya işaret ediyor. Yedek olarak bulabileceğim en iyi şey şu derleme talimatları: github.com/google/googletest/blob/master/googletest/README.md Ancak bu sadece cmake ile nasıl derleneceğini açıklıyor. Otomatik araçlar için en iyi sonucu veren şu yanıtı buldum: stackoverflow.com/a/36000856/1487069
Carlo Wood

Yanıtlar:


144

Başlamadan önce bu notu Google'dan okuyup anladığınızdan emin olun ! Bu eğitim, gtest kullanımını kolaylaştırır, ancak kötü hatalar ortaya çıkarabilir .

1. Googletest çerçevesini edinin

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

Veya el ile alın . Bu küçük Nasıl Yapılır'ı korumayacağım, bu yüzden üzerine tökezlediyseniz ve bağlantıların modası geçmişse, düzenlemekten çekinmeyin.

2. Google testini paketinden çıkarın ve oluşturun

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

3. Başlıkları ve kitaplıkları sisteminize "kurun".

Bu adım dağıtımdan dağıtıma farklılık gösterebilir, bu nedenle başlıkları ve kitaplıkları doğru dizine kopyaladığınızdan emin olun. Bunu Debian'ın eski gtest kitaplıklarının nerede olduğunu kontrol ederek başardım . Ama eminim bunu yapmanın daha iyi yolları vardır. Not: make installtehlikelidir ve desteklenmez

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

4. Bağlayıcının önbelleğini güncelleyin

... ve GNU Bağlayıcısının kitaplıkları bilip bilmediğini kontrol edin

sudo ldconfig -v | grep gtest

Çıktı şöyle görünüyorsa:

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

o zaman her şey yolunda.

gTestframework artık kullanıma hazır. -lgtestLinker bayrağı olarak ayarlayarak ve isteğe bağlı olarak, kendi test ana yordamınızı, açık -lgtest_mainbayrağı yazmadıysanız, projenizi kitaplığa bağlamayı unutmayın .

Bundan sonra , nasıl çalıştığını öğrenmek için Google dokümantasyonuna ve çerçeve hakkındaki eski dokümanlara gitmek isteyebilirsiniz . Mutlu kodlamalar!

Düzenleme: Bu, OS X için de geçerli! "OS X'te googleTest nasıl doğru şekilde kurulur" bölümüne bakın.


2
make installKitaplığı ve başlıkları manuel olarak kopyalamak yerine kullanabileceğiniz bir hedef yok mu?
Shawn Çene

14
Makefile çıktısının 'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
alıntı

Dosyalar 1.8.0 sürümünde yeniden adlandırıldı mı? include/gtestSöyleyebileceğim kadarıyla yok .
Nubcake

2
Gönderiniz güncel değil. Lütfen insanları yanıltmayın, sudo cp -a libgtest_main.so libgtest.so /usr/lib/artık çalışmıyor. Dosya başlamak için orada bile değil.
Schütze

Debian'ın önceden yüklenmiş bir paylaşılan kitaplığı neden kaldırdığını da bilmek istiyorum (bunu, üst akış önerilerine göre yaptılar : bugs.debian.org/cgi-bin/bugreport.cgi?bug=802587 ). Orada verilen wiki bağlantısı artık mevcut değil. Peki bu neden böyleydi?
Carlo Wood

33

Bunu ubuntu kullanıcıları için özel olarak cevaplayayım. İlk olarak gtest geliştirme paketini kurarak başlayın.

sudo apt-get install libgtest-dev

Bu paketin yalnızca kaynak dosyaları yüklediğini unutmayın. Gerekli kitaplık dosyalarını oluşturmak için kodu kendiniz derlemelisiniz. Bu kaynak dosyalar / usr / src / gtest konumunda bulunmalıdır. Bu klasöre gidin ve kitaplığı derlemek için cmake kullanın:

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

Şimdi gtest kullanan programlarınızı derlemek için, onu şunlarla bağlamanız gerekir:

-lgtest -lgtest_main -lpthread

Bu, Ubuntu 14.04LTS'de benim için mükemmel çalıştı.


1
Aslında kitaplıkları manuel olarak kopyalamak zorunda değilsiniz, Makefile'da bunun için bir hedef var. Bunu şu şekilde yapabilirsiniz: sudo apt-get install cmake # install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install Oluşturulmalı ve kopyalanmalı / usr / local / lib /
Alexander Zinovyev

1
@AlexanderZinovyev "make: *** Hedefi 'yükleme' yapmak için kural yok. Dur." "sudo make install"
komutunu

2
"sudo make install" Ubuntu 18.04'te çalıştı, ancak Ubuntu 16.04'te çalışmadı.
Ahmed Nassar

1
@AhmedNassar: "sudo make install", "sudo cp * .a / usr / lib" ile aynı şeyi yapar. Bu nedenle, oluşturulan Makefile'da yükleme seçeneği mevcut değilse, bunları manuel olarak kopyalamanız
yeterlidir

Manuel olarak yapmaya gerek yoktur sudo cp *.a /usr/lib, sadece sudo make installiyi olmalıdır.
lingjiankong

26

Bunu anlamam biraz zaman aldı çünkü normal "make install" kaldırıldı ve cmake kullanmıyorum. İşte paylaşacağım deneyim. Benim ev dizininde kapsamında Google test framework yüklü yüzden iş yerinde, ben, Linux üzerinde kök erişiminiz yok: ~/usr/gtest/.

Paketi ~ / usr / gtest / dizinine paylaşılan kitaplıklar olarak örnek derlemeyle birlikte yüklemek için:

$ 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

Kurulumu doğrulamak için basit bir test örneği olarak aşağıdaki test.c dosyasını kullanın:

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

Derlemek için:

    $ 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
Son satırda hata alıyorum: / usr / bin / ld: /tmp/cczG727X.o: '_ZN7testing4TestC2Ev' sembolüne tanımsız referans. Bu test.cpp dosyasını kütüphanelerden önce yerleştirdim. yani: g ++ test.cpp -I $ GTEST_HOME / include -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread
user9869932

Gtest_main ( lgtest_main) ile bağlantı oluşturuyorsanız main, test dosyasında kendinizinkini tanımlamanıza gerek yoktur .
Gino Mempin

10

CMake kullanıyorsanız, buradaExternalProject_Add açıklandığı gibi kullanabilirsiniz .

Bu, gtest kaynak kodunu deponuzda tutmanıza veya herhangi bir yere kurmanıza gerek kalmaz. Yapı ağacınıza otomatik olarak indirilir ve oluşturulur.


3

Debian / Ubuntu için güncelleme

Google Mock (paket:) google-mockve Google Test (paket libgtest-dev:) birleştirildi. Yeni paket denir googletest. Her iki eski isim de geriye dönük uyumluluk için hala mevcuttur ve artık yeni pakete bağlıdır googletest.

Dolayısıyla, kitaplıklarınızı paket deposundan almak için aşağıdakileri yapabilirsiniz:

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

Bundan sonra, bağlantı kurabilirsiniz -lgmock(veya -lgmock_mainözel bir ana yöntem kullanmıyorsanız karşı ) ve -lpthread. Bu, en azından benim durumumda Google Test'i kullanmak için yeterliydi.

Google Test'in en güncel sürümünü istiyorsanız, onu github'dan indirin. Bundan sonra adımlar benzer:

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

Gördüğünüz gibi, kitaplıkların oluşturulduğu yol değişti. Yeni yolun yakında paket depoları için de geçerli olabileceğini unutmayın.

Kitaplıkları manuel olarak kopyalamak yerine kullanabilirsiniz sudo make install. "Şu anda" çalışıyor, ancak geçmişte her zaman işe yaramadığını unutmayın. Ayrıca, bu komutu kullanırken hedef konum üzerinde kontrole sahip değilsiniz ve kirletmek istemeyebilirsiniz /usr/lib.


1

Ben de benzer şekilde bu durumdan etkilenmiştim ve bunun için kendi Ubuntu kaynak paketlerimi oluşturdum. Bu kaynak paketleri, kolayca ikili bir paket oluşturmanıza olanak sağlar. Bu yazı itibariyle en son gtest & gmock kaynağına dayanıyorlar.

Google Test DEB Kaynak Paketi

Google Mock DEB Kaynak Paketi

İkili paketi oluşturmak için şunu yapın:

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

Size bazı ön koşul paketlerine ihtiyacınız olduğunu söyleyebilir, bu durumda bunları sadece apt-get install yüklemeniz gerekir. Bunun dışında, yerleşik .deb ikili paketleri daha sonra ana dizinde yer almalıdır.

GMock için süreç aynıdır.

Yan not olarak, kaynak paketlerime özel olmamakla birlikte, gtest'i birim testinize bağlarken, önce gtest'in dahil edildiğinden emin olun ( https://bbs.archlinux.org/viewtopic.php?id=156639 ) Bu, ortak sorun.


Paketiniz derlemeye çalıştığımda bana hatalar veriyor. Herhangi bir neden? İşte günlüğüm test.cpp :(. text + 0x57): testing::Message::Message()' test.cpp:(.text+0x84): undefined reference to teste tanımsız başvuru :: internal :: AssertHelper :: AssertHelper (test :: TestPartResult :: Type, char const *, int, char const *) 'test. cpp :(. text + 0x97): `testing :: internal :: AssertHelper :: operator = (testing :: Message const &) const 'ifadesine tanımsız başvuru ... o kadar uzun ki her şeyi gönderemiyorum. Bunu yepyeni bir Ubuntu 14.04 VM'de yaptım, böylece gerekli bağımlılıklar dışında hiçbir şey kurulmadı.
ddelnano

@ddelnano Evet, bu küçük google test gemisine de rastladım. Görünüşe göre paylaşılan kitaplıkların sırası önemli. Gtest'i birim testinize bağlarken, gtest'i diğer kitaplıklardan önce eklemeyi deneyin. Bu soruna ulaştığımda
Nick Weedon

@ddelnano, ayrıca test takımınızın 'ana' tanımlı olmaması durumunda, 'gtest_main' ile bağlantı kurmayı unutmayın.
Nick Weedon

Başka kütüphaneler eklemedim. #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(); }
dosyamda

boşver o yorumu gönderene kadar blog yazısını okumadım. Artık nihayet çalışıyor!
ddelnano

1

Dün (2016-06-22) benim gibi aynı duruma başka birinin gelmesi ve ayrıca önceden yayınlanan yaklaşımlarla başarılı olmaması durumunda - Lubuntu 14.04benim için aşağıdaki komut zincirini kullanarak çalıştı:

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

Askubuntu'nun bu cevabı benim için işe yaradı. libgtest-devKaynakları ve derlemeleri oradan almak için paketi kullandığından, diğer seçeneklerden daha basit ve hataya daha az açık görünüyor : /ubuntu/145887/why-no-library-files-installed-for-google- test? answerertab = oylar # tab-top

Lütfen bu yanıta bakın, ancak kısayol olarak buradaki adımları da sağlıyorum:

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/

Bundan sonra, gtesthiçbir sorun olmadan bağlı olan projemi inşa edebilirim .


1

Aşağıdaki yöntem /usr/lib, CMakeLists.txtdosyanızda minimum değişiklik gerektirirken dizinle manuel olarak uğraşmayı önler . Ayrıca paket yöneticinizin temiz bir şekilde kaldırmasına da izin verir libgtest-dev.

Buradaki fikir, libgtest-devpaketi şu yolla aldığınızda

sudo apt install libgtest-dev

Kaynak yerde saklanır /usr/src/googletest

CMakeLists.txtGerekli bağımlılıkları bulabilmesi için o dizine basitçe işaret edebilirsiniz .

Basitçe yerine FindGTestsahipadd_subdirectory(/usr/src/googletest gtest)

Sonunda böyle görünmeli

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

0

Bu, Google test ve alay kitaplığını Ubuntu / Debian tabanlı sisteme yükleyecektir:

sudo apt-get install google-mock

Google Cloud'da debian tabanlı görüntüde test edilmiştir.


Hmm, hayır, sanırım bu sadece yüklüyor googlemock, ancak googletest(gtest) yüklemiyor. En azından bana olan buydu.
jotadepicas

0

Bu, hem gtest hem de gmock 1.7.0'ı oluşturacak ve yükleyecektir:

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

@ ManuelSchneid3r'nin cevabına dayalı 1.8.1 için şunu yapmam gerekiyordu:

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

Daha sonra make install1.8.1 için işe yarıyor gibiydi, ancak @ ManuelSchneid3r'yi takip etmenin anlamı:

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

Bir süredir bu cevabı yazdım, değeri olmadığını / geçersiz olduğunu düşünüyorsanız, sorunun ne olduğunu bana bildirin.
ntg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.