Cara mengatur googleTest sebagai perpustakaan bersama di Linux

89

Debian tidak lagi menyediakan paket prakompilasi untuk gTest. Mereka menyarankan Anda mengintegrasikan kerangka kerja ke dalam file makefile proyek Anda. Tapi saya ingin menjaga makefile saya tetap bersih. Bagaimana cara menyiapkan gTest seperti versi sebelumnya (<1.6.0), sehingga saya dapat menautkan ke perpustakaan?

ManuelSchneid3r
sumber
2
BTW, build paling gt dikelola menggunakan autotools sehingga ./configure && make && make installalur kerja standar akan berfungsi dengan baik. Saya tidak yakin apakah ini memerlukan posting karena tidak ada bedanya dengan mengkompilasi banyak paket lain dari sumber.
Shawn Chin
7
Saya kira tidak semua pengguna berpengalaman seperti Anda. Saya baru-baru ini beralih dari Windows ke Linux dan saya akan senang menemukan sesuatu seperti ini di StackOverflow.
ManuelSchneid3r
2
Perhatikan bahwa Google merekomendasikan agar Anda JANGAN membuat perpustakaan, melainkan menyertakan kode GTest ke dalam proyek Anda. Lihat code.google.com/p/googletest/wiki/…
Mawg mengatakan memulihkan Monica
Itulah catatan pertama dalam jawabannya.
ManuelSchneid3r
1
Tautan yang disediakan oleh @Mawg rusak (wiki telah dihapus), tampaknya berfungsi tetapi mengarah ke halaman yang tidak lagi membahas topik (cukup membingungkan). Yang terbaik yang dapat saya temukan sebagai penggantinya adalah petunjuk pembuatan ini: github.com/google/googletest/blob/master/googletest/README.md Namun itu hanya menjelaskan cara membangun dengan cmake. Untuk autotool, saya menemukan jawaban berikut untuk bekerja paling baik: stackoverflow.com/a/36000856/1487069
Carlo Wood

Jawaban:

144

Sebelum Anda mulai, pastikan Anda telah membaca dan memahami catatan ini dari Google ! Tutorial ini membuat penggunaan gtest mudah, tetapi dapat menyebabkan bug yang tidak menyenangkan .

1. Dapatkan kerangka kerja googletest

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

Atau dapatkan dengan tangan . Saya tidak akan mempertahankan How-to kecil ini, jadi jika Anda menemukannya dan tautannya sudah usang, silakan mengeditnya.

2. Buka kemasan dan buat pengujian google

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

3. "Instal" header dan libs di sistem Anda.

Langkah ini mungkin berbeda dari satu distro ke distro, jadi pastikan Anda menyalin header dan libs ke direktori yang benar. Saya menyelesaikan ini dengan memeriksa di mana bekas libs gtest Debian berada. Tapi saya yakin ada cara yang lebih baik untuk melakukan ini. Catatan: make installberbahaya dan tidak didukung

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

4. Perbarui cache linker

... dan periksa apakah GNU Linker mengetahui libs

sudo ldconfig -v | grep gtest

Jika hasilnya terlihat seperti ini:

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

maka semuanya baik-baik saja.

gTestframework sekarang siap digunakan. Jangan lupa untuk menautkan project Anda ke library dengan menyetel -lgtestsebagai flag linker dan secara opsional, jika Anda tidak menulis mainroutine pengujian Anda sendiri, -lgtest_mainflag eksplisit .

Selanjutnya Anda mungkin ingin membuka dokumentasi Google , dan dokumen lama tentang kerangka kerja untuk mempelajari cara kerjanya. Selamat membuat kode!

Sunting: Ini juga berfungsi untuk OS X! Lihat "Cara menyiapkan googleTest dengan benar di OS X"

ManuelSchneid3r
sumber
2
Apakah tidak ada make installtarget yang dapat Anda gunakan daripada menyalin pustaka dan header secara manual?
Shawn Chin
14
Kutipan dari output makefile:'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
ManuelSchneid3r
Apakah file telah diganti namanya dalam versi 1.8.0? Tidak ada include/gtestsejauh yang saya tahu.
Nubcake
2
Posting Anda sudah usang. Tolong jangan menyesatkan orang, sudo cp -a libgtest_main.so libgtest.so /usr/lib/tidak berfungsi lagi. File tersebut bahkan tidak ada di sana untuk memulai.
Schütze
Saya juga ingin tahu mengapa debian menghapus pustaka bersama yang sudah diinstal sebelumnya (mereka melakukannya sesuai rekomendasi upstream: bugs.debian.org/cgi-bin/bugreport.cgi?bug=802587 ). Tautan wiki yang diberikan di sana sudah tidak ada lagi. Jadi, mengapa demikian?
Carlo Wood
33

Izinkan saya menjawab ini khusus untuk pengguna ubuntu. Pertama mulai dengan menginstal paket pengembangan paling gtest.

sudo apt-get install libgtest-dev

Perhatikan bahwa paket ini hanya menginstal file sumber. Anda harus mengkompilasi kode sendiri untuk membuat file perpustakaan yang diperlukan. File sumber ini harus ditempatkan di / usr / src / gtest. Jelajahi folder ini dan gunakan cmake untuk mengkompilasi perpustakaan:

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

Sekarang untuk mengkompilasi program Anda yang menggunakan gtest, Anda harus menautkannya dengan:

-lgtest -lgtest_main -lpthread

Ini bekerja dengan sempurna untuk saya di Ubuntu 14.04LTS.

amritkrs
sumber
1
Sebenarnya Anda tidak perlu menyalin perpustakaan secara manual, ada target untuk itu di Makefile. Anda bisa melakukannya seperti itu: sudo apt-get install cmake # install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install Itu harus dibuat dan salin / usr / local / lib /
Alexander Zinovyev
1
@AlexanderZinovyev Saya mendapatkan "make: *** Tidak ada aturan untuk membuat target 'instal'. Berhenti." ketika saya menjalankan "sudo make install"
m4l490n
2
"sudo make install" berfungsi di Ubuntu 18.04, tetapi tidak berfungsi di Ubuntu 16.04.
Ahmed Nassar
1
@AhmedNassar: "sudo make install" melakukan hal yang sama seperti "sudo cp * .a / usr / lib". Jadi, jika opsi instal tidak tersedia di Makefile yang dihasilkan, Anda cukup menyalinnya secara manual
amritkrs
Tidak perlu manual sudo cp *.a /usr/lib, cukup repalce sudo make installsaja sudah cukup.
lingjiankong
26

Butuh beberapa saat bagi saya untuk mengetahuinya karena "make install" yang normal telah dihapus dan saya tidak menggunakan cmake. Inilah pengalaman saya untuk berbagi. Di tempat kerja, saya tidak memiliki akses root pada Linux, jadi saya menginstal kerangka uji Google di bawah direktori rumah saya: ~/usr/gtest/.

Untuk menginstal paket di ~ / usr / gtest / sebagai library bersama, bersama dengan contoh build juga:

$ 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

Untuk memvalidasi penginstalan, gunakan test.c berikut sebagai contoh pengujian sederhana:

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

Untuk mengkompilasi:

    $ 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
sumber
1
Dengan baris terakhir saya mendapatkan kesalahan: / usr / bin / ld: /tmp/cczG727X.o: referensi tidak ditentukan ke simbol '_ZN7testing4TestC2Ev'. Saya memperbaiki menempatkan test.cpp ini sebelum perpustakaan. yaitu: g ++ test.cpp -Saya $ GTEST_HOME / include -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread
user9869932
Jika menautkan ke gtest_main ( lgtest_main), Anda tidak perlu menentukan milik Anda sendiri maindi file pengujian.
Gino Mempin
10

Jika Anda kebetulan menggunakan CMake, Anda dapat menggunakan ExternalProject_Addseperti yang dijelaskan di sini .

Ini menghindari Anda harus menyimpan kode sumber paling gt di repositori Anda, atau menginstalnya di mana saja. Itu diunduh dan dibangun di pohon build Anda secara otomatis.

Fraser
sumber
3

Pembaruan untuk Debian / Ubuntu

Google Mock (paket:) google-mockdan Google Test (paket libgtest-dev:) telah digabungkan. Paket baru disebut googletest. Kedua nama lama masih tersedia untuk kompatibilitas mundur dan sekarang bergantung pada paket baru googletest.

Jadi, untuk mendapatkan perpustakaan Anda dari repositori paket, Anda dapat melakukan hal berikut:

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

Setelah itu, Anda dapat menautkan ke -lgmock(atau melawan -lgmock_mainjika Anda tidak menggunakan metode utama khusus) dan -lpthread. Ini cukup untuk menggunakan Google Test setidaknya dalam kasus saya.

Jika Anda menginginkan versi Google Test terbaru, unduh dari github. Setelah itu, langkah-langkahnya serupa:

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

Seperti yang Anda lihat, jalur di mana pustaka dibuat telah berubah. Perlu diingat bahwa jalur baru mungkin juga akan segera berlaku untuk repositori paket.

Alih-alih menyalin pustaka secara manual, Anda bisa menggunakan sudo make install. Ini "saat ini" berfungsi, tetapi ketahuilah bahwa itu tidak selalu berhasil di masa lalu. Selain itu, Anda tidak memiliki kendali atas lokasi target saat menggunakan perintah ini dan Anda mungkin tidak ingin mencemari /usr/lib.

Thomas
sumber
1

Saya juga merasa kurang beruntung dengan situasi ini dan akhirnya membuat paket sumber Ubuntu saya sendiri untuk ini. Paket sumber ini memungkinkan Anda menghasilkan paket biner dengan mudah. Mereka didasarkan pada sumber gtest & gmock terbaru pada posting ini.

Paket Sumber DEB Uji Google

Paket Sumber DEB Google Mock

Untuk membangun paket biner lakukan ini:

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

Ini mungkin memberi tahu Anda bahwa Anda memerlukan beberapa paket prasyarat dalam hal ini Anda hanya perlu menginstal apt-get. Selain itu, paket biner .deb yang dibangun harus ditempatkan di direktori induk.

Untuk GMock, prosesnya sama.

Sebagai catatan tambahan, meskipun tidak spesifik untuk paket sumber saya, saat menautkan gtest ke pengujian unit Anda, pastikan bahwa gtest disertakan terlebih dahulu ( https://bbs.archlinux.org/viewtopic.php?id=156639 ) Ini tampak seperti Gotcha umum.

Nick Weedon
sumber
Paket Anda memberi saya kesalahan saat saya mencoba mengompilasi. Ada alasan kenapa ?? berikut ini log saya test.cpp :(. text + 0x57): referensi yang tidak ditentukan untuk 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): referensi tidak terdefinisi ke `testing :: internal :: AssertHelper :: operator = (testing :: Message const &) const '... sangat lama sehingga saya tidak dapat memposting semuanya. Saya melakukan ini di Ubuntu 14.04 VM yang baru sehingga tidak ada lagi yang diinstal kecuali dependensi yang diperlukan.
ddelnano
@ddelnano Ya, saya juga menemukan permata kecil tes Google ini. Rupanya urutan perpustakaan bersama itu penting. Saat menautkan paling gt ke pengujian unit Anda, coba sertakan gtest sebelum pustaka lain. Ketika saya mengalami masalah ini, tautan ini menyelesaikannya untuk saya: bbs.archlinux.org/viewtopic.php?id=156639
Nick Weedon
@ddelnano, juga jika rangkaian pengujian Anda tidak memiliki 'utama' yang ditentukan, jangan lupa untuk menautkan ke 'gtest_main'.
Nick Weedon
Saya tidak menyertakan perpustakaan lain. ini semua yang saya miliki di file saya #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
Tidak masalah saya tidak membaca posting blog sampai setelah saya memposting komentar itu. Sekarang akhirnya berhasil!
ddelnano
1

Untuk berjaga-jaga jika ada orang lain yang berada dalam situasi yang sama seperti saya kemarin (2016-06-22) dan juga tidak berhasil dengan pendekatan yang sudah diposting - di Lubuntu 14.04atasnya berfungsi untuk saya menggunakan rantai perintah berikut:

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

Jawaban dari askubuntu inilah yang berhasil untuk saya. Tampaknya lebih sederhana daripada opsi lain dan tidak terlalu rentan kesalahan, karena ia menggunakan paket libgtest-devuntuk mendapatkan sumber dan membangun dari sana: /ubuntu/145887/why-no-library-files-installed-for-google- test? answerertab = vote # tab-top

Silakan merujuk ke jawaban itu, tetapi hanya sebagai jalan pintas saya juga memberikan langkah-langkahnya di sini:

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/

Setelah itu, saya dapat membangun proyek saya yang bergantung gtesttanpa masalah.

jotadepicas
sumber
1

Metode berikut menghindari mengotak-atik /usr/libdirektori secara manual sementara juga membutuhkan sedikit perubahan pada CMakeLists.txtfile Anda . Ini juga memungkinkan manajer paket Anda menghapus instalasi dengan bersih libgtest-dev.

Idenya adalah ketika Anda mendapatkan libgtest-devpaket melalui

sudo apt install libgtest-dev

Sumber disimpan di lokasi /usr/src/googletest

Anda cukup mengarahkan Anda CMakeLists.txtke direktori itu sehingga dapat menemukan dependensi yang diperlukan

Cukup ganti FindGTestdenganadd_subdirectory(/usr/src/googletest gtest)

Pada akhirnya, akan terlihat seperti ini

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

Ini akan menginstal tes google dan perpustakaan tiruan di sistem berbasis Ubuntu / Debian:

sudo apt-get install google-mock

Diuji di google cloud dalam gambar berbasis debian.

Shubham Chaudhary
sumber
Hmm, tidak, saya pikir ini hanya menginstal googlemock, tetapi tidak menginstal googletest(gtest). Setidaknya itulah yang terjadi pada saya.
jotadepicas
0

Ini akan membangun dan menginstal gtest dan 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
sumber
-1

Untuk 1.8.1 berdasarkan jawaban @ ManuelSchneid3r, saya harus melakukan:

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

Saya kemudian melakukan make installyang tampaknya berhasil untuk 1.8.1, tetapi mengikuti @ ManuelSchneid3r itu berarti:

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/include/gmock /usr/include
sudo cp `find .|grep .so$` /usr/lib/
ntg
sumber
Sudah lama saya menulis jawaban ini, beri tahu saya apa masalahnya jika menurut Anda tidak ada nilai / tidak valid.
ntg