Câu hỏi Cách thiết lập googleTest như một thư viện được chia sẻ trên Linux


Debian không cung cấp bất kỳ gói biên dịch sẵn nào cho gTest nữa. Họ đề nghị bạn tích hợp khung công tác vào các dự án của bạn. Nhưng tôi muốn giữ cho tập tin của tôi sạch sẽ. Làm thế nào để tôi thiết lập gTest như các phiên bản trước (<1.6.0), để tôi có thể liên kết aganist thư viện?


76
2017-11-22 13:38


gốc


Thật tuyệt khi bạn đang chia sẻ kiến ​​thức và kinh nghiệm của mình, cảm ơn vì đã đóng góp. Tuy nhiên, đây là một trang web QA do đó làm cụm từ câu hỏi của bạn như là một câu hỏi và không phải là một rant. - Shawn Chin
Các bản dựng BTW, gtest được quản lý bằng các autotools để chuẩn ./configure && make && make install quy trình làm việc chỉ hoạt động tốt. Tôi không chắc chắn nếu điều này đảm bảo một bài viết vì nó sẽ không khác nhau từ biên dịch nhiều gói khác từ nguồn. - Shawn Chin
Tôi đoán không phải tất cả người dùng đều có kinh nghiệm như bạn. Gần đây tôi đã đến từ Windows để Linux và tôi đã có thể được hạnh phúc để tìm một cái gì đó như thế này trên StackOverflow. - ManuelSchneid3r
Lưu ý rằng Google khuyên bạn KHÔNG nên tạo thư viện, nhưng thay vào đó, hãy bao gồm mã GTest vào dự án của bạn. Xem code.google.com/p/googletest/wiki/… - Mawg
Đó là lưu ý đầu tiên trong câu trả lời. - ManuelSchneid3r


Các câu trả lời:


Trước khi bạn bắt đầu, hãy chắc chắn rằng bạn đã đọc và hiểu ghi chú này từ Google! Hướng dẫn này giúp việc sử dụng dễ dàng nhất, nhưng có thể giới thiệu lỗi khó chịu.

1. Lấy khung googletest

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

Hoặc lấy nó bằng cách tay. Tôi sẽ không duy trì chút ít Hướng dẫn này, vì vậy nếu bạn tình cờ gặp nó và các liên kết đã lỗi thời, hãy chỉnh sửa nó.

2. Giải nén và xây dựng kiểm tra google

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

3. "Cài đặt" các tiêu đề và libs trên hệ thống của bạn.

Bước này có thể khác với bản phân phối để phân phối, vì vậy hãy đảm bảo bạn sao chép tiêu đề và lib trong thư mục chính xác. Tôi đã hoàn thành điều này bằng cách kiểm tra nơi Thư viện trước đây của người bán nợ cũ đã được đặt. Nhưng tôi chắc chắn có những cách tốt hơn để làm điều này. Chú thích: make install nguy hiểm và không được hỗ trợ

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

4. Cập nhật bộ nhớ cache của trình liên kết

... và kiểm tra xem GNU Linker có biết libs không

$ sudo ldconfig -v | grep gtest

Nếu đầu ra trông như thế này:

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

, mọi thứ đều ổn.

gTestframework hiện đã sẵn sàng để sử dụng. Đừng quên liên kết dự án của bạn với thư viện bằng cách thiết lập -lgtest làm cờ liên kết và tùy chọn, nếu bạn không viết chính thức thử nghiệm của riêng mình, -lgtest_main cờ.

Từ đây bạn có thể muốn truy cập vào Googles tài liệu về khuôn khổ để tìm hiểu cách hoạt động. Chúc mừng mã hóa!

Chỉnh sửa: Điều này làm việc cho OS X quá! Xem "Cách thiết lập googleTest đúng cách trên OS X"


125
2017-11-22 13:38



Không có không make install mục tiêu mà bạn có thể sử dụng thay vì sao chép thư viện và tiêu đề theo cách thủ công? - Shawn Chin
Trích dẫn đầu ra của makefile: 'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system. - ManuelSchneid3r
Cảm ơn. Tôi đứng sửa. - Shawn Chin
Điều này làm việc như một say mê. Cảm ơn bạn! - gd1
Cảm ơn rất nhiều ManuelSchneid3r !!! Nó hoạt động tốt !! Nhưng gmock bị thiếu. - sree


Phải mất một lúc tôi mới hiểu được điều này bởi vì "make install" bình thường đã bị loại bỏ và tôi không sử dụng cmake. Đây là kinh nghiệm của tôi để chia sẻ. Tại nơi làm việc, tôi không có quyền truy cập root trên Linux, vì vậy tôi đã cài đặt khung kiểm tra của Google trong thư mục chính của mình: ~/usr/gtest/.

Để cài đặt gói trong ~ / usr / gtest / như các thư viện được chia sẻ, cùng với việc tạo mẫu:

$ 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

Để xác thực cài đặt, hãy sử dụng test.c sau đây làm ví dụ kiểm tra đơn giả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();
    }

Để biên dịch:

    $ 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 

24
2018-01-23 16:33



Với dòng cuối cùng tôi nhận được lỗi: / usr / bin / ld: /tmp/cczG727X.o: undefined tham chiếu đến ký hiệu '_ZN7testing4TestC2Ev'. Tôi cố định này đặt test.cpp trước khi các thư viện. ví dụ: g ++ test.cpp -I $ GTEST_HOME / bao gồm -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread - xyz
Cảm ơn ví dụ xác thực - p1nkrock


Hãy để tôi trả lời cụ thể cho người dùng ubuntu. Bắt đầu đầu tiên bằng cách cài đặt gói phát triển gtest.

sudo apt-get install libgtest-dev

Lưu ý rằng gói này chỉ cài đặt các tệp nguồn. Bạn phải tự biên dịch mã để tạo các tệp thư viện cần thiết. Các tệp nguồn này phải được đặt tại / usr / src / gtest. Duyệt đến thư mục này và sử dụng cmake để biên dịch thư viện:

sudo apt-get install cmake # install cmake
cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make

# copy or symlink libgtest.a and libgtest_main.a to your /usr/lib folder
sudo cp *.a /usr/lib

Bây giờ để biên dịch chương trình của bạn sử dụng gtest, bạn phải liên kết nó với:

-lgtest -lgtest_main

Điều này làm việc hoàn hảo cho tôi trên Ubuntu 14.04LTS.


17
2018-01-31 09:43



Trên thực tế, bạn không phải sao chép thư viện theo cách thủ công, có một mục tiêu cho điều đó trong Makefile. Bạn chỉ có thể làm như thế: sudo apt-get install cmake # cài đặt cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install Bạn nên cài đặt và copy / usr / local / lib / - Alexander Zinovyev
@AlexanderZinovyev Tôi nhận được "make: *** Không có quy tắc để làm cho mục tiêu 'cài đặt'. Dừng lại." khi tôi thực thi "sudo make install" - m4l490n
"sudo make install" hoạt động trên Ubuntu 18.04, nhưng không hoạt động trên Ubuntu 16.04. - Ahmed Nassar


Nếu bạn tình cờ sử dụng CMake, bạn có thể sử dụng ExternalProject_Add như mô tả đây.

Điều này tránh cho bạn phải giữ mã nguồn gtest trong kho lưu trữ của bạn hoặc cài đặt nó ở bất cứ đâu. Nó được tải xuống và được xây dựng trong cây xây dựng của bạn một cách tự động.


7
2017-11-22 13:51





Tôi đã bị choáng ngợp bởi tình huống này và cuối cùng tạo ra các gói nguồn Ubuntu của riêng tôi cho việc này. Các gói nguồn này cho phép bạn dễ dàng tạo ra một gói nhị phân. Chúng dựa trên nguồn gtest & gmock mới nhất kể từ bài đăng này.

Gói nguồn DEB thử nghiệm của Google

Gói nguồn Google Mock DEB

Để xây dựng gói nhị phân thực hiện việc này:

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

Nó có thể cho bạn biết rằng bạn cần một số gói cần thiết trong trường hợp bạn chỉ cần apt-get cài đặt chúng. Ngoài ra, các gói nhị phân .deb được xây dựng nên được đặt trong thư mục cha.

Đối với GMock, quá trình này là như nhau.

Là một lưu ý phụ, mặc dù không cụ thể với các gói nguồn của tôi, khi liên kết gtest với thử nghiệm đơn vị của bạn, hãy đảm bảo rằng gtest được bao gồm trước tiên (https://bbs.archlinux.org/viewtopic.php?id=156639) Điều này có vẻ giống như một bản ghi nhớ chung.


1
2018-03-26 13:32



Gói của bạn cho tôi lỗi khi tôi cố gắng biên dịch. Có lý do gì không ?? đây là nhật ký của tôi test.cpp: (. text + 0x57): tham chiếu không xác định testing::Message::Message()' test.cpp:(.text+0x84): undefined reference to thử nghiệm :: nội bộ :: AssertHelper :: AssertHelper (thử nghiệm :: TestPartResult :: Loại, char const *, int, char const *) 'test.cpp: (. văn bản + 0x97): undefined tham chiếu đến `testing :: internal: : AssertHelper :: operator = (thử nghiệm :: Message const &) const '... quá lâu đến mức tôi không thể đăng toàn bộ nội dung. Tôi đã làm điều này trong một máy ảo Ubuntu 14.04 hoàn toàn mới nên không có gì khác được cài đặt ngoại trừ các phụ thuộc cần thiết. - ddelnano
@ddelnano Vâng tôi đã chạy vào viên đá quý thử nghiệm google nhỏ này quá. Rõ ràng thứ tự của các thư viện được chia sẻ là quan trọng. Khi liên kết gtest với thử nghiệm đơn vị của bạn, hãy thử bao gồm gtest trước các thư viện khác. Khi tôi nhấn vấn đề này, liên kết này giải quyết nó cho tôi: bbs.archlinux.org/viewtopic.php?id=156639 - Nick Weedon
@ddelnano, cũng nếu bộ thử nghiệm của bạn không có 'chính' được xác định thì đừng quên liên kết với 'gtest_main'. - Nick Weedon
Tôi không bao gồm bất kỳ thư viện nào khác. đây là tất cả những gì tôi có trong hồ sơ của mình #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
nevermind Tôi đã không đọc bài đăng trên blog cho đến sau khi tôi đăng nhận xét đó. Nó bây giờ là cuối cùng làm việc! - ddelnano


Chỉ trong trường hợp ai đó khác trong tình huống tương tự như tôi ngày hôm qua (2016-06-22) và cũng không thành công với các phương pháp đã đăng - trên Lubuntu 14.04 nó làm việc cho tôi bằng cách sử dụng chuỗi lệnh sau đây:

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
2018-06-23 14:30





Câu trả lời này từ askubuntu là những gì làm việc cho tôi. Có vẻ đơn giản hơn các tùy chọn khác ít bị lỗi hơn, vì nó sử dụng gói libgtest-dev để lấy nguồn và xây dựng từ đó: https://askubuntu.com/questions/145887/why-no-library-files-installed-for-google-test?answertab=votes#tab-top

Vui lòng tham khảo câu trả lời đó, nhưng cũng giống như một phím tắt, tôi cũng cung cấp các bước ở đây:

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/

Sau đó, tôi có thể xây dựng dự án của tôi mà phụ thuộc vào gtest không có vấn đề gì.


1
2017-12-24 07:09





Thao tác này sẽ cài đặt thư viện thử nghiệm và thử nghiệm google trong hệ thống dựa trên Ubuntu / Debian:

sudo apt-get install google-mock

Đã thử nghiệm trong đám mây của google trong hình ảnh dựa trên debian.


0
2017-11-11 22:42



Hmm, không, tôi nghĩ rằng điều này chỉ cài đặt googlemock, nhưng nó không cài đặt googletest (gtest). Ít nhất đó là những gì đã xảy ra với tôi. - jotadepicas