วิธีตั้งค่า googleTest เป็นไลบรารีที่ใช้ร่วมกันบน Linux


90

Debian ไม่มีแพ็คเกจที่คอมไพล์ไว้ล่วงหน้าสำหรับ gTest อีกต่อไป พวกเขาแนะนำให้คุณรวมกรอบงานเข้ากับ makefile ของโครงการของคุณ แต่ฉันต้องการรักษา makefile ของฉันให้สะอาด ฉันจะตั้งค่า gTest เหมือนกับเวอร์ชันก่อนหน้า (<1.6.0) ได้อย่างไรเพื่อให้สามารถเชื่อมโยงกับไลบรารี


2
BTW, gtest builds ได้รับการจัดการโดยใช้ autotools ดังนั้น./configure && make && make installเวิร์กโฟลว์มาตรฐานควรทำงานได้ดี ฉันไม่แน่ใจว่านี่เป็นการรับประกันว่าโพสต์นี้จะไม่แตกต่างจากการรวบรวมแพ็คเกจอื่น ๆ จากแหล่งที่มา
Shawn Chin

7
ฉันเดาว่าผู้ใช้บางคนไม่ได้มีประสบการณ์เท่าคุณ ฉันเพิ่งมาจาก Windows เป็น Linux และฉันยินดีที่จะพบสิ่งนี้ใน StackOverflow
ManuelSchneid3r

2
โปรดทราบว่า Google ไม่แนะนำให้คุณสร้างไลบรารี แต่รวมโค้ด GTest ไว้ในโปรเจ็กต์ของคุณแทน ดูcode.google.com/p/googletest/wiki/…
Mawg บอกว่าคืนสถานะ Monica

นั่นคือบันทึกแรกในคำตอบ
ManuelSchneid3r

1
ลิงก์ที่ให้โดย @Mawg ใช้งานไม่ได้ (วิกิถูกลบออก) ดูเหมือนว่าจะใช้งานได้ แต่ชี้ไปที่หน้าที่ไม่ได้อยู่ในหัวข้ออีกต่อไป (ค่อนข้างสับสน) สิ่งที่ดีที่สุดที่ฉันสามารถหาทดแทนได้คือคำแนะนำการสร้างเหล่านี้: github.com/google/googletest/blob/master/googletest/README.mdอย่างไรก็ตามนั่นจะอธิบายเฉพาะวิธีสร้างด้วย cmake สำหรับเครื่องมืออัตโนมัติฉันพบว่าคำตอบต่อไปนี้ทำงานได้ดีที่สุด: stackoverflow.com/a/36000856/1487069
Carlo Wood

คำตอบ:


144

ก่อนที่คุณจะเริ่มตรวจสอบให้แน่ใจว่าคุณได้อ่านและเข้าใจ บันทึกนี้จาก Google แล้ว ! กวดวิชานี้จะทำให้การใช้ gtest ง่าย แต่อาจนำข้อบกพร่องที่น่ารังเกียจ

1. รับ googletest framework

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

หรือได้รับมันด้วยมือ ฉันจะไม่รักษา How-to เล็ก ๆ น้อย ๆ นี้ไว้ดังนั้นหากคุณสะดุดกับมันและลิงก์ต่างๆล้าสมัยอย่าลังเลที่จะแก้ไข

2. แกะกล่องและสร้างการทดสอบของ Google

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

3. "ติดตั้ง" ส่วนหัวและ libs ในระบบของคุณ

ขั้นตอนนี้อาจแตกต่างจาก distro ถึง distro ดังนั้นตรวจสอบให้แน่ใจว่าคุณคัดลอกส่วนหัวและ libs ในไดเร็กทอรีที่ถูกต้อง ฉันทำสิ่งนี้ได้สำเร็จโดยตรวจสอบว่าDebians ในอดีตเคยเป็น gtest libsอยู่ที่ไหน แต่ฉันแน่ใจว่ามีวิธีที่ดีกว่านี้ในการทำเช่นนี้ หมายเหตุ: make installเป็นอันตรายและไม่รองรับ

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

4. อัปเดตแคชของตัวเชื่อมโยง

... และตรวจสอบว่า GNU Linker รู้จัก libs หรือไม่

sudo ldconfig -v | grep gtest

หากผลลัพธ์มีลักษณะดังนี้:

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

ทุกอย่างเรียบร้อยดี

gTestframework พร้อมใช้งานแล้ว ก็อย่าลืมที่จะเชื่อมโยงโครงการของคุณกับห้องสมุดโดยการตั้ง-lgtestธงลิงเกอร์และเลือกที่ถ้าคุณไม่ได้เขียน mainroutine ทดสอบของคุณเองอย่างชัดเจน-lgtest_mainธง

จากตรงนี้คุณอาจต้องการไปที่เอกสารของ Googles และเอกสารเก่าเกี่ยวกับกรอบงานเพื่อเรียนรู้วิธีการทำงาน ขอให้สนุกกับการเขียนโค้ด!

แก้ไข: สิ่งนี้ใช้ได้กับ OS X ด้วย! ดู "วิธีตั้งค่า googleTest บน OS X อย่างถูกต้อง"


2
ไม่มีmake installเป้าหมายที่คุณสามารถใช้แทนการคัดลอกไลบรารีและส่วนหัวด้วยตนเองได้หรือไม่?
Shawn Chin

14
อ้างถึงผลลัพธ์ของ makefile:'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
ManuelSchneid3r

ไฟล์ถูกเปลี่ยนชื่อเป็นเวอร์ชัน 1.8.0 หรือไม่ ไม่มีinclude/gtestเท่าที่ฉันบอกได้
Nubcake

2
โพสต์ของคุณล้าสมัย โปรดอย่าทำให้คนเข้าใจผิดsudo cp -a libgtest_main.so libgtest.so /usr/lib/ไม่ทำงานอีกต่อไป ไม่มีไฟล์ที่จะเริ่มต้นด้วยซ้ำ
Schütze

ฉันต้องการทราบด้วยว่าทำไมเดเบียนจึงลบไลบรารีที่ใช้ร่วมกันที่ติดตั้งไว้ล่วงหน้า (ทำตามคำแนะนำของอัปสตรีม : bugs.debian.org/cgi-bin/bugreport.cgi?bug=802587 ) ลิงก์วิกิที่ระบุไม่มีอยู่แล้ว แล้วทำไมถึงเป็นเช่นนั้น?
Carlo Wood

33

ให้ฉันตอบสิ่งนี้โดยเฉพาะสำหรับผู้ใช้ ubuntu เริ่มต้นด้วยการติดตั้งแพ็คเกจการพัฒนา gtest

sudo apt-get install libgtest-dev

โปรดทราบว่าแพ็คเกจนี้ติดตั้งเฉพาะไฟล์ต้นฉบับ คุณต้องคอมไพล์โค้ดด้วยตัวเองเพื่อสร้างไฟล์ไลบรารีที่จำเป็น ไฟล์ต้นฉบับเหล่านี้ควรอยู่ที่ / usr / src / gtest เรียกดูโฟลเดอร์นี้และใช้ cmake เพื่อรวบรวมไลบรารี:

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

ตอนนี้ในการรวบรวมโปรแกรมของคุณที่ใช้ gtest คุณต้องเชื่อมโยงกับ:

-lgtest -lgtest_main -lpthread

สิ่งนี้ใช้งานได้ดีสำหรับฉันบน Ubuntu 14.04LTS


1
จริงๆแล้วคุณไม่จำเป็นต้องคัดลอกไลบรารีด้วยตนเองมีเป้าหมายสำหรับสิ่งนั้นใน Makefile คุณสามารถทำได้เช่นนั้น: sudo apt-get install cmake # install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install That should be built and copy / usr / local / lib /
Alexander Zinovyev

1
@AlexanderZinovyev ฉันได้รับ "make: *** ไม่มีกฎที่จะทำให้เป้าหมาย" ติดตั้ง "หยุด" เมื่อฉันรัน "sudo make install"
m4l490n

2
"sudo make install" ทำงานบน Ubuntu 18.04 แต่ไม่ทำงานบน Ubuntu 16.04
Ahmed Nassar

1
@AhmedNassar: "sudo make install" ก็เหมือนกับ "sudo cp * .a / usr / lib" ดังนั้นหากไม่มีตัวเลือกการติดตั้งใน Makefile ที่สร้างขึ้นคุณเพียงแค่คัดลอกด้วยตนเอง
amritkrs

ไม่จำเป็นต้องทำด้วยตนเองsudo cp *.a /usr/libเพียงแค่เปลี่ยนใหม่ด้วยsudo make installก็น่าจะดี
lingjiankong

26

ฉันใช้เวลาพอสมควรในการหาสิ่งนี้เนื่องจาก "make install" ปกติถูกลบออกไปแล้วและฉันไม่ได้ใช้ cmake นี่คือประสบการณ์ของฉันที่จะแบ่งปัน ที่ทำงานผมไม่ได้มีการเข้าถึงรากบน Linux ดังนั้นผมติดตั้งกรอบทดสอบ Google ~/usr/gtest/ภายใต้ไดเรกทอรีบ้านของฉัน:

ในการติดตั้งแพ็คเกจใน ~ / usr / gtest / เป็นไลบรารีที่ใช้ร่วมกันพร้อมกับการสร้างตัวอย่างด้วย:

$ 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

ในการตรวจสอบความถูกต้องของการติดตั้งให้ใช้ test.c ต่อไปนี้เป็นตัวอย่างการทดสอบอย่างง่าย:

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

ในการรวบรวม:

    $ 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
ในบรรทัดสุดท้ายฉันได้รับข้อผิดพลาด: / usr / bin / ld: /tmp/cczG727X.o: ไม่ได้กำหนดการอ้างอิงถึงสัญลักษณ์ '_ZN7testing4TestC2Ev' ฉันแก้ไขการวาง test.cpp นี้ก่อนไลบรารี เช่น: g ++ test.cpp -I $ GTEST_HOME / include -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread
user9869932

หากลิงก์กับ gtest_main ( lgtest_main) ไม่จำเป็นต้องกำหนดค่าของคุณเองmainในไฟล์ทดสอบ
Gino Mempin

10

หากคุณเกิดขึ้นจะใช้ CMake คุณสามารถใช้ExternalProject_Addตามที่อธิบายไว้ที่นี่

เพื่อหลีกเลี่ยงไม่ให้คุณต้องเก็บซอร์สโค้ด gtest ไว้ในที่เก็บของคุณหรือติดตั้งที่ใดก็ได้ มันถูกดาวน์โหลดและสร้างขึ้นในโครงสร้างโครงสร้างของคุณโดยอัตโนมัติ


3

อัปเดตสำหรับ Debian / Ubuntu

Google Mock (package :) google-mockและ Google Test (package libgtest-dev:) รวมเข้าด้วยกัน googletestแพคเกจใหม่ที่เรียกว่า googletestทั้งชื่อเก่ายังคงมีอยู่สำหรับการทำงานร่วมกันหลังและตอนนี้ขึ้นอยู่กับแพคเกจใหม่

ดังนั้นในการรับไลบรารีของคุณจากที่เก็บแพ็กเกจคุณสามารถทำสิ่งต่อไปนี้:

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

หลังจากนั้นคุณสามารถเชื่อมโยงกับ-lgmock(หรือผิด-lgmock_mainถ้าคุณไม่ได้ใช้วิธีการหลักที่กำหนดเอง) -lpthreadและ อย่างน้อยก็เพียงพอสำหรับการใช้ Google Test ในกรณีของฉัน

หากคุณต้องการทดสอบ Google เวอร์ชันล่าสุดให้ดาวน์โหลดจาก github หลังจากนั้นขั้นตอนจะคล้ายกัน:

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

อย่างที่คุณเห็นเส้นทางที่สร้างไลบรารีมีการเปลี่ยนแปลง โปรดทราบว่าเส้นทางใหม่อาจใช้ได้กับที่เก็บแพ็กเกจเร็ว ๆ นี้เช่นกัน

แทนที่จะคัดลอกไลบรารีด้วยตนเองคุณสามารถใช้sudo make installไฟล์. "ปัจจุบัน" ใช้งานได้ แต่โปรดทราบว่าในอดีตไม่ได้ผลเสมอไป /usr/libนอกจากนี้คุณยังไม่ได้มีการควบคุมสถานที่เป้าหมายเมื่อใช้คำสั่งนี้และคุณอาจไม่ต้องการที่จะก่อให้เกิดมลพิษ


1

ฉันรู้สึกแย่กับสถานการณ์นี้ในทำนองเดียวกันและลงเอยด้วยการสร้างแพ็คเกจซอร์ส Ubuntu ของตัวเองสำหรับสิ่งนี้ แพ็กเกจต้นทางเหล่านี้ช่วยให้คุณสร้างแพ็กเกจไบนารีได้อย่างง่ายดาย โดยอ้างอิงจากแหล่ง gtest & gmock ล่าสุดในโพสต์นี้

ชุดทดสอบแหล่งที่มาของ Google Test DEB

แพ็คเกจ Google Mock DEB Source

ในการสร้างแพ็คเกจไบนารีให้ทำสิ่งนี้:

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

อาจบอกคุณได้ว่าคุณต้องการแพ็คเกจที่จำเป็นล่วงหน้าซึ่งในกรณีนี้คุณต้องติดตั้ง apt-get นอกเหนือจากนั้นแพคเกจไบนารี. deb ที่สร้างขึ้นควรอยู่ในไดเร็กทอรีหลัก

สำหรับ GMock กระบวนการจะเหมือนกัน

หมายเหตุด้านข้างแม้ว่าจะไม่เฉพาะเจาะจงกับแพ็กเกจต้นทางของฉันเมื่อเชื่อมโยง gtest กับการทดสอบหน่วยของคุณโปรดตรวจสอบให้แน่ใจว่ารวม gtest ไว้ก่อน ( https://bbs.archlinux.org/viewtopic.php?id=156639 ) ดูเหมือนว่า gotcha ทั่วไป


แพคเกจของคุณทำให้ฉันมีข้อผิดพลาดเมื่อฉันพยายามรวบรวม เพราะอะไร ?? นี่คือบันทึกของฉัน test.cpp :(. text + 0x57): การอ้างอิงที่ไม่ได้กำหนดสำหรับtesting::Message::Message()' test.cpp:(.text+0x84): undefined reference to การทดสอบ :: internal :: AssertHelper :: AssertHelper (การทดสอบ :: TestPartResult :: Type, char const *, int, char const *) 'การทดสอบ cpp :(. text + 0x97): undefined reference to `testing :: internal :: AssertHelper :: operator = (testing :: Message const &) const '... มันนานมากจนฉันไม่สามารถโพสต์สิ่งทั้งหมด ฉันทำสิ่งนี้ใน Ubuntu 14.04 VM ใหม่ล่าสุดดังนั้นจึงไม่มีการติดตั้งสิ่งอื่นใดนอกจากการอ้างอิงที่จำเป็น
ddelnano

@ddelnano ใช่ฉันเจออัญมณีทดสอบของ Google ตัวเล็ก ๆ ด้วย เห็นได้ชัดว่าลำดับของไลบรารีที่แชร์มีความสำคัญ เมื่อเชื่อมโยง gtest กับการทดสอบหน่วยของคุณให้ลองรวม gtest ก่อนไลบรารีอื่น ๆ เมื่อฉันพบปัญหานี้ลิงก์นี้จะแก้ไขให้ฉัน: bbs.archlinux.org/viewtopic.php?id=156639
Nick Weedon

@ddelnano นอกจากนี้หากชุดทดสอบของคุณไม่ได้กำหนด "main" ไว้อย่าลืมเชื่อมโยงกับ "gtest_main"
Nick Weedon

ฉันไม่ได้รวมไลบรารีอื่น ๆ นี่คือทั้งหมดที่ฉันมีในไฟล์ #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

ไม่เป็นไรฉันไม่ได้อ่านบล็อกโพสต์จนกว่าฉันจะโพสต์ความคิดเห็นนั้น ในที่สุดก็ใช้งานได้แล้ว!
ddelnano

1

ในกรณีที่มีคนอื่นตกอยู่ในสถานการณ์เดียวกันเช่นฉันเมื่อวานนี้ (2016-06-22) และไม่ประสบความสำเร็จกับวิธีการที่โพสต์ไว้แล้วซึ่งLubuntu 14.04ใช้ได้กับฉันโดยใช้ชุดคำสั่งต่อไปนี้:

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 คือสิ่งที่ใช้ได้ผลสำหรับฉัน ดูเหมือนง่ายกว่าตัวเลือกอื่น ๆ ข้อผิดพลาดน้อยกว่าเนื่องจากใช้แพ็คเกจlibgtest-devเพื่อรับแหล่งที่มาและสร้างจากที่นั่น: /ubuntu/145887/why-no-library-files-installed-for-google- test? answerertab = โหวต # tab-top

โปรดอ้างถึงคำตอบนั้น แต่ฉันให้ขั้นตอนที่นี่เป็นทางลัดเช่นกัน:

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/

หลังจากนั้นฉันสามารถสร้างโปรเจ็กต์ของฉันซึ่งขึ้นอยู่gtestกับว่าไม่มีปัญหาใด ๆ


1

วิธีต่อไปนี้หลีกเลี่ยงการยุ่งกับ/usr/libไดเร็กทอรีด้วยตนเองในขณะที่ต้องการการเปลี่ยนแปลงเล็กน้อยในCMakeLists.txtไฟล์ของคุณ libgtest-devนอกจากนี้ยังช่วยผู้จัดการแพคเกจเรียบร้อยถอนการติดตั้งของคุณ

แนวคิดก็คือเมื่อคุณได้รับlibgtest-devแพ็คเกจผ่านทางไฟล์

sudo apt install libgtest-dev

แหล่งที่มาจะถูกเก็บไว้ในตำแหน่ง /usr/src/googletest

คุณสามารถชี้CMakeLists.txtไปที่ไดเร็กทอรีนั้นเพื่อให้สามารถค้นหาการอ้างอิงที่จำเป็นได้

เพียงแค่แทนที่FindGTestด้วยadd_subdirectory(/usr/src/googletest gtest)

ในตอนท้ายควรมีลักษณะเช่นนี้

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

0

สิ่งนี้จะติดตั้งการทดสอบของ Google และไลบรารีจำลองในระบบที่ใช้ Ubuntu / Debian:

sudo apt-get install google-mock

ทดสอบใน google cloud ในภาพที่ใช้เดเบียน


อืมไม่ฉันคิดว่านี่เป็นการติดตั้งเท่านั้นgooglemockแต่ไม่ได้ติดตั้งgoogletest(gtest) อย่างน้อยนั่นคือสิ่งที่เกิดขึ้นกับฉัน
jotadepicas

0

สิ่งนี้จะสร้างและติดตั้งทั้ง gtest และ 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

-1

สำหรับ 1.8.1 ตามคำตอบของ @ ManuelSchneid3r ฉันต้องทำ:

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

จากนั้นฉันก็ทำmake installสิ่งที่ดูเหมือนจะใช้ได้กับ 1.8.1 แต่ตาม @ ManuelSchneid3r มันจะหมายถึง:

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

เป็นเวลานานแล้วที่ฉันเขียนคำตอบนี้โปรดแจ้งให้เราทราบว่ามีปัญหาอะไรหากคุณคิดว่าไม่มีค่า / ไม่ถูกต้อง
ntg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.