Cách thiết lập googleTest làm thư viện chia sẻ trên Linux


87

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


2
Các bản dựng BTW, gtest được quản lý bằng cách sử dụng công cụ tự động nên ./configure && make && make installquy trình làm việc tiêu chuẩn sẽ hoạt động tốt. Tôi không chắc liệu điều này có đảm bảo cho một bài đăng hay không vì nó sẽ không khác gì việc biên dịch nhiều gói khác từ nguồn.
Shawn Chin

7
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 đã chuyển từ Windows sang Linux và tôi sẽ rất vui khi tìm thấy thứ gì đó như thế này trên StackOverflow.
ManuelSchneid3r

1
Lưu ý rằng Google khuyên bạn KHÔNG nên xây dựng thư viện mà hãy đưa mã GTest vào dự án của mình. Xem code.google.com/p/googletest/wiki/…
Mawg cho biết hãy khôi phục Monica vào

Đó là ghi chú đầu tiên trong câu trả lời.
ManuelSchneid3r

1
Liên kết do @Mawg cung cấp bị hỏng (wiki đã bị xóa), nó có vẻ hoạt động nhưng lại trỏ đến một trang không thuộc chủ đề nữa (khá khó hiểu). Điều tốt nhất mà tôi có thể tìm để thay thế là các hướng dẫn xây dựng sau: github.com/google/googletest/blob/master/googletest/README.md Tuy nhiên, điều đó chỉ giải thích cách xây dựng bằng cmake. Đối với công cụ tự động, tôi thấy câu trả lời sau hoạt động tốt nhất: stackoverflow.com/a/36000856/1487069
Carlo Wood

Câu trả lời:


143

Trước khi bắt đầu, hãy đảm bảo rằng bạn đã đọc và hiểu ghi chú này từ Google ! Hướng dẫn này làm cho việc sử dụng gtest trở nên dễ dàng, nhưng có thể gây ra các 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 nhận nó bằng tay . Tôi sẽ không duy trì Hướng dẫn nhỏ 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 thử nghiệm 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à tiêu đề trên hệ thống của bạn.

Bước này có thể khác với các bản phân phối, vì vậy hãy đảm bảo rằng bạn sao chép các tiêu đề và lib trong đúng thư mục. Tôi đã hoàn thành việc này bằng cách kiểm tra xem những con lib cứng nhất trước đây của Debians nằm ở đâu. Nhưng tôi chắc rằng có nhiều cách tốt hơn để làm điều này. Lưu ý: make installnguy hiểm và không được hỗ trợ

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/gtest/libgtest_main.so googlemock/gtest/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 các lib

sudo ldconfig -v | grep gtest

Nếu đầu ra giống như thế này:

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

thì mọi thứ vẫn ổn.

gTestframework hiện đã sẵn sàng để sử dụng. Chỉ cần đừng quên liên kết dự án của bạn với thư viện bằng cách đặt -lgtestlàm cờ trình liên kết và tùy chọn, nếu bạn không viết chương trình chính thử nghiệm của riêng mình, -lgtest_maincờ rõ ràng .

Từ đây, bạn có thể muốn truy cập tài liệu của Google và các tài liệu cũ về khung để tìm hiểu cách hoạt động của nó. Chúc bạn viết mã vui vẻ!

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


2
Không có make installmục tiêu nào mà bạn có thể sử dụng thay vì sao chép thủ công thư viện và tiêu đề?
Shawn Chin

13
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ác tệp đã được đổi tên trong phiên bản 1.8.0 chưa? Không có include/gtestxa như tôi có thể nói.
Nubcake,

2
Bài đăng của bạn đã lỗi thời. Xin đừng lừa dối mọi người, sudo cp -a libgtest_main.so libgtest.so /usr/lib/không hoạt động nữa. Tệp thậm chí không có ở đó để bắt đầu.
Schütze

Tôi cũng muốn biết lý do tại sao debian loại bỏ một thư viện chia sẻ được cài đặt sẵn (họ đã làm như vậy theo khuyến nghị ngược dòng: bug.debian.org/cgi-bin/bugreport.cgi?bug=802587 ). Tuy nhiên, liên kết wiki được cung cấp ở đó không còn tồn tại. Vậy tại sao lại như vậy?
Carlo Wood

33

Hãy để tôi trả lời điều này cụ thể cho người dùng ubuntu. Đầu tiên hãy bắt đầu 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 mkdir build
cd build
sudo cmake ..
sudo make
sudo make install

Bây giờ để biên dịch các 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 -lpthread

Điều này hoạt động hoàn hảo đối với tôi trên Ubuntu 14.04LTS.


1
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ư vậy: sudo apt-get install cmake # install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install Cái đó nên được xây dựng và sao chép / usr / local / lib /
Alexander Zinovyev

1
@AlexanderZinovyev Tôi nhận được "make: *** Không có quy tắc nào để thực hiện mục tiêu 'cài đặt'. Dừng lại." khi tôi thực hiện "sudo make install"
m4l490n

2
"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

1
@AhmedNassar: "sudo make install" hoạt động tương tự như "sudo cp * .a / usr / lib". Vì vậy, nếu cài đặt tùy chọn không có sẵn trong tạo Makefile, bạn chỉ cần sao chép chúng bằng tay
amritkrs

Không cần phải làm thủ công sudo cp *.a /usr/lib, chỉ cần repalce nó bằng sudo make installsẽ ổn.
lingjiankong

26

Tôi mất một lúc để tìm ra điều này vì "thực hiện cài đặt" thông 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 test framework Google dưới thư mục chính của tôi: ~/usr/gtest/.

Để cài đặt gói trong ~ / usr / gtest / dưới dạng thư viện được chia sẻ, cùng với bản dựng 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 

1
Với dòng cuối cùng, tôi gặp lỗi: / usr / bin / ld: /tmp/cczG727X.o: tham chiếu không xác định đến biểu tượng '_ZN7testing4TestC2Ev'. Tôi đã sửa lỗi đặt test.cpp này trước các thư viện. tức là: g ++ test.cpp -I $ GTEST_HOME / bao gồm -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread
user9869932

Nếu liên kết chống lại gtest_main ( lgtest_main), không cần phải xác định của riêng bạn maintrong tệp thử nghiệm.
Gino Mempin

10

Nếu bạn đang sử dụng CMake, bạn có thể sử dụng ExternalProject_Addnhư được mô tả ở đây .

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


2

Cập nhật cho Debian / Ubuntu

Google Mock (package google-mock:) và Google Test (package libgtest-dev:) đã được hợp nhất. Gói mới được gọi googletest. Cả hai tên cũ vẫn có sẵn để tương thích ngược và bây giờ phụ thuộc vào gói mới googletest.

Vì vậy, để lấy thư viện của bạn từ kho lưu trữ gói, bạn có thể làm như sau:

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

Sau đó, bạn có thể liên kết chống lại -lgmock(hoặc chống lại -lgmock_mainnếu bạn không sử dụng phương pháp chính tùy chỉnh) và -lpthread. Điều này ít nhất là đủ để sử dụng Google Test trong các trường hợp của tôi.

Nếu bạn muốn có phiên bản Google Test mới nhất, hãy tải xuống từ github. Sau đó, các bước tương tự:

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

Như bạn có thể thấy, đường dẫn nơi các thư viện được tạo đã thay đổi. Hãy nhớ rằng đường dẫn mới cũng có thể sớm hợp lệ cho các kho lưu trữ gói.

Thay vì sao chép các thư viện theo cách thủ công, bạn có thể sử dụng sudo make install. Nó "hiện tại" hoạt động, nhưng lưu ý rằng nó không phải lúc nào cũng hoạt động trong quá khứ. Ngoài ra, bạn không có quyền kiểm soát vị trí mục tiêu khi sử dụng lệnh này và bạn có thể không muốn gây ô nhiễm /usr/lib.


1

Tương tự, tôi cũng bị choáng ngợp bởi tình huống này và cuối cùng đã tạo các gói nguồn Ubuntu của riêng mình 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 tính đến bài đăng này.

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

Gói nguồn DEB của Google Mock

Để xây dựng gói nhị phân, hãy làm như sau:

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 tiên quyế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 sau đó sẽ nằm trong thư mục mẹ.

Đối với GMock, quá trình này cũng giống như vậy.

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


Gói của bạn cho tôi lỗi khi tôi cố gắng biên dịch. Bất kỳ lý do tại sao ?? đây là bài kiểm tra nhật ký của tôi. cpp :(. text + 0x57): tham chiếu không xác định để testing::Message::Message()' test.cpp:(.text+0x84): undefined reference to kiểm tra :: internal :: AssertHelper :: AssertHelper (testing :: TestPartResult :: Type, char const *, int, char const *) '. cpp :(. text + 0x97): tham chiếu không xác định đến `testing :: internal :: AssertHelper :: operator = (testing :: Message const &) const '... nó dài đến mức tôi không thể đăng toàn bộ. 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 cũng gặp phải viên ngọc thử nghiệm nhỏ này của google. 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 bài kiểm tra đơ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 gặp sự cố 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, ngoài ra nếu bộ thử nghiệm của bạn không có 'main' đượ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ả tôi đã có trong hồ sơ của tôi #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

Tôi đã không đọc bài đăng trên blog cho đến khi tôi đăng nhận xét đó. Nó bây giờ cuối cùng đã hoạt động!
ddelnano

1

Đề phòng trường hợp ai đó khác rơi vào trường hợp 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 cách tiếp cận đã được đăng - trên Lubuntu 14.04đó đã hiệu quả với tôi bằng cách sử dụng chuỗi lệnh sau:

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

Câu trả lời này từ askubuntu là thứ phù hợp với tôi. Có vẻ đơn giản hơn các tùy chọn khác và ít bị lỗi hơn, vì nó sử dụng gói libgtest-devđể lấy các nguồn và bản dựng từ đó: /ubuntu/145887/why-no-library-files-installed-for-google- test? answersertab = bầu chọn # tab-top

Vui lòng tham khảo câu trả lời đó, nhưng chỉ là 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 mình mà gtestkhông có vấn đề gì.


1

Phương pháp sau đây tránh làm rối /usr/libthư mục theo cách thủ công đồng thời yêu cầu thay đổi tối thiểu trong CMakeLists.txttệp của bạn . Nó cũng cho phép trình quản lý gói của bạn gỡ cài đặt một cách rõ ràng libgtest-dev.

Ý tưởng là khi bạn nhận được libgtest-devgói hàng qua

sudo apt install libgtest-dev

Nguồn được lưu trữ ở vị trí /usr/src/googletest

Bạn có thể chỉ cần trỏ CMakeLists.txtđến thư mục đó để nó có thể tìm thấy các phụ thuộc cần thiết

Đơn giản chỉ cần thay thế FindGTestbằngadd_subdirectory(/usr/src/googletest gtest)

Cuối cùng, nó sẽ trông như thế này

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

0

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

sudo apt-get install google-mock

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


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

0

Điều này sẽ xây dựng và cài đặt cả gtest và 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

Đối với 1.8.1 dựa trên câu trả lời của @ ManuelSchneid3r, tôi phải làm như sau:

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

Sau đó, tôi đã làm make installđiều đó dường như hoạt động cho 1.8.1, nhưng theo @ ManuelSchneid3r, điều đó có nghĩa là:

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

Đã lâu rồi tôi mới viết câu trả lời này, hãy cho tôi biết vấn đề với nó là gì nếu bạn cho rằng nó không có giá trị / không hợp lệ.
ntg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.