Linux에서 googleTest를 공유 라이브러리로 설정하는 방법


87

Debian은 더 이상 gTest 용으로 사전 컴파일 된 패키지를 제공하지 않습니다. 프레임 워크를 프로젝트의 메이크 파일에 통합 할 것을 제안합니다. 하지만 내 메이크 파일을 깨끗하게 유지하고 싶습니다. 라이브러리에 연결할 수 있도록 이전 버전 (<1.6.0)과 같이 gTest를 설정하려면 어떻게해야합니까?


2
BTW, gtest 빌드는 autotools를 사용하여 관리되므로 표준 ./configure && make && make install워크 플로가 잘 작동합니다. 소스에서 다른 많은 패키지를 컴파일하는 것과 다르지 않기 때문에 이것이 게시물을 보장하는지 확실하지 않습니다.
Shawn Chin

7
모든 사용자가 당신만큼 경험이있는 것은 아닙니다. 나는 최근에 Windows에서 Linux로 왔고 StackOverflow에서 이와 같은 것을 발견하면 기뻤을 것입니다.
ManuelSchneid3r

1
Google은 라이브러리를 빌드하지 말고 프로젝트에 GTest 코드를 포함하는 것이 좋습니다. code.google.com/p/googletest/wiki/…
Mawg는 Monica를 복원한다고 말합니다.

그게 대답의 첫 번째 메모입니다.
ManuelSchneid3r

1
@Mawg에서 제공 한 링크가 끊어졌습니다 (위키가 제거됨), 작동하는 것처럼 보이지만 더 이상 주제에 해당하지 않는 페이지를 가리 킵니다 (상당히 혼란 스럽습니다). 대체품으로 찾을 수있는 가장 좋은 것은 다음 빌드 지침입니다. github.com/google/googletest/blob/master/googletest/README.md 그러나 cmake로 빌드하는 방법 만 설명합니다. : autotools를 위해, 나는 일 최선을 다음과 같은 대답을 발견 stackoverflow.com/a/36000856/1487069
카를로 목재

답변:


143

시작하기 전에 Google의이 메모를 읽고 이해했는지 확인하십시오 ! 이 튜토리얼은 gtest를 쉽게 사용할 수있게 해주지 만 끔찍한 버그 가 생길 수 있습니다 .

1. googletest 프레임 워크 가져 오기

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. 시스템에 헤더와 라이브러리를 "설치"합니다.

이 단계는 배포판마다 다를 수 있으므로 올바른 디렉토리에 헤더와 라이브러리를 복사해야합니다. 나는 데비안의 이전 gtest 라이브러리 가 어디에 있는지 확인함으로써 이것을 달성했습니다 . 하지만 더 나은 방법이 있다고 확신합니다. 참고 : 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 링커가 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링커 플래그 로 설정 하고 선택적으로 자체 테스트 메인 루틴을 작성하지 않은 경우 명시 적 -lgtest_main플래그 로 설정하여 프로젝트를 라이브러리에 연결하는 것을 잊지 마십시오 .

이제부터는 Google 문서 와 프레임 워크에 대한 이전 문서 로 이동하여 작동 방식을 배울 수 있습니다. 즐거운 코딩 되세요!

편집 : 이것은 OS X에서도 작동합니다! "OS X에서 googleTest를 올바르게 설정하는 방법"을 참조하십시오.


2
더 없습니까 make install수동 라이브러리와 헤더를 복사하는 대신 사용할 수있는 대상은?
Shawn Chin

13
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

우분투 사용자를 위해 특별히 대답하겠습니다. 먼저 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 빌드하고 복사해야합니다. / 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"와 동일한 작업을 수행합니다. 옵션을 설치한다면, 생성 된 메이크에서 사용할 수 없습니다, 당신은 단지 수동으로 복사하는 것은
amritkrs

수동으로 할 필요 없다 sudo cp *.a /usr/lib, 그냥 repalce와 sudo make install잘되어야한다.
lingjiankong 19

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 소스 코드를 보관하거나 어디에나 설치할 필요가 없습니다. 빌드 트리에 자동으로 다운로드되고 빌드됩니다.


2

Debian / Ubuntu 용 업데이트

Google Mock (패키지 :) google-mock과 Google 테스트 (패키지 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

나는 이와 비슷하게이 상황에 압도 당했고 결국이를위한 우분투 소스 패키지를 만들었다. 이러한 소스 패키지를 사용하면 바이너리 패키지를 쉽게 생성 할 수 있습니다. 이 게시물의 최신 gtest 및 gmock 소스를 기반으로합니다.

Google 테스트 DEB 소스 패키지

Google Mock DEB 소스 패키지

바이너리 패키지를 빌드하려면 다음을 수행하십시오.

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 ) 일반적인 잡았다.


컴파일하려고 할 때 패키지에 오류가 발생합니다. 이유는 무엇입니까 ?? 여기 내 로그 test.cpp :(. text + 0x57) : testing::Message::Message()' test.cpp:(.text+0x84): undefined reference to testing :: internal :: AssertHelper :: AssertHelper (testing :: TestPartResult :: Type, char const *, int, char const *) '테스트에 대한 정의되지 않은 참조가 있습니다. cpp :(. text + 0x97) :`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 2015 년

다른 라이브러리는 포함하지 않았습니다. 이것이 내가 가진 모든 것 #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 2015 년

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? answertab = votes # 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

Ubuntu / Debian 기반 시스템에 Google 테스트 및 모의 라이브러리를 설치합니다.

sudo apt-get install google-mock

데비안 기반 이미지의 Google 클라우드에서 테스트되었습니다.


흠, 아니오, 이것은 설치 만 설치한다고 생각 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

@ ManuelSchneid3r의 답변을 기반으로 1.8.1의 경우 다음을 수행해야했습니다.

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 install1.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.