Visual Studio 2005에서 Google C ++ 테스트 프레임 워크 (gtest)를 설정하는 방법


82

웹 사이트에 문서화되어 있지 않으며 사람들이 프레임 워크를 설정하는 데 문제가있는 것 같습니다. 누군가 샘플 프로젝트 설정에 대한 단계별 소개를 보여줄 수 있습니까?


다행 누군가가 ... 질문
보양

답변:


44

Arlaharen이 말한 것은 기본적으로 옳았지만 링커 오류를 설명하는 부분을 생략했습니다. 우선 CRT 없이 런타임 라이브러리로 애플리케이션을 빌드해야합니다 . 응용 프로그램 배포를 실제로 단순화하므로 항상이 작업을 수행해야합니다. 이렇게하지 않으면 모든 사용자에게 Visual C ++ 런타임 라이브러리가 설치되어 있어야하며, 시스템에 미스터리 한 DLL이 없다고 불평하지 않는 사용자는 링크하는 데 추가로 수백 킬로바이트가 필요합니다. CRT를 정적으로, 당신은 나중에 지원에서 많은 두통을 덜어줍니다 (저를 믿으십시오-나는 그것을 어려운 방법으로 배웠습니다!).

어쨌든이 작업을 수행하려면 대상의 속성-> C / C ++-> 코드 생성-> 런타임 라이브러리로 이동하고 릴리스 빌드의 경우 "Multi-Threaded"로 설정하고 "Multi-Threaded Debug"로 설정해야합니다. 디버그 빌드.

gtest 라이브러리를 동일한 방식으로 내장되어 있기 때문에, 당신은 당신이 올바른 버전에 연결되어 있는지 확인해야 할 것이 , 그렇지 않으면 당신은 BTW (본 오류는 런타임 라이브러리의 다른 사본에 끌어 링커,이 MFC를 사용하는지 여부에 차이가 없어야합니다.) gtest를 디버그 및 릴리스 모드 로 빌드 하고 두 복사본을 모두 유지해야합니다. 그런 다음 릴리스 빌드의 gtest.lib / gtest_main.lib 및 디버그 빌드의 gtestd.lib / gtest_maind.lib에 대해 링크합니다.

또한 응용 프로그램이 gtest 헤더 파일이 저장된 디렉토리 (속성-> C / C ++-> 일반-> 추가 포함 디렉토리)를 가리키는 지 확인해야하지만 링커 오류가 발생하면 가정합니다. 이 부분을 이미 수정했거나 그렇지 않으면 먼저 처리해야 할 컴파일러 오류가 훨씬 더 많을 것입니다.


나는 하루 종일 이것을 "어려운 방법"으로 배웠다. 마침내 두 가지를 모두 같은 방식으로 구축 한 후 작동하게되었습니다. 답변 해 주셔서 감사합니다.하지만 늦었습니다. : / 그리고 BTW, 귀하의 CRT 제안이 잘못되었지만 이에 대해 논의 할 공간이 충분하지 않습니다. tinyurl.com/dj5k7k
knaser

"어려운 방법"으로 배운 경우 CRT 런타임 dll이 "재배포 가능"이라고하는 것을 잊었을 수 있습니다. 따라서 자신의 설치 프로그램에 재배포 설치 프로그램을 포함하여 직접 재배포해야합니다. , 또는 단순히 자신의 설치 폴더에서 필요한 dll을 추출하여 ... (필요한 경우 매니페스트 파일 포함)
smerlin

1
CRT를 정적으로 연결하면 애플리케이션이 악용 / 보안 수정 사항을 선택하지 못함을 의미합니다
paulm

106

(이 지침은 디버그 구성에 대해 작동하는 테스트 프레임 워크를 가져옵니다. 릴리스 구성에 동일한 프로세스를 적용하는 것은 매우 간단합니다.)

Google C ++ 테스트 프레임 워크 받기

  1. 최신 gtest 프레임 워크 다운로드
  2. 압축 해제 C:\gtest

프레임 워크 라이브러리 빌드

  1. C:\gtest\msvc\gtest.slnVisual Studio에서 열기
  2. 구성을 "디버그"로 설정합니다.
  3. 솔루션 구축

테스트 프로젝트 생성 및 구성

  1. 새 솔루션을 만들고 Visual C ++> Win32> Win32 콘솔 응용 프로그램 템플릿을 선택합니다.
  2. 새로 생성 된 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택합니다.
  3. 구성을 디버그로 변경하십시오.
  4. 구성 속성> C / C ++> 일반> 추가 포함 디렉터리 : 추가 C:\gtest\include
  5. 구성 속성> C / C ++> 코드 생성> 런타임 라이브러리 : 코드가 런타임 DLL에 연결되어 있으면 다중 스레드 디버그 DLL (/ MDd)을 선택합니다. 그렇지 않은 경우 다중 스레드 디버그 (/ MTd)를 선택합니다.
  6. 구성 속성> 링커> 일반> 추가 라이브러리 디렉터리 : gtestd.lib의 위치에 따라 C:\gtest\msvc\gtest\Debug또는 추가C:\gtest\msvc\gtest-md\Debug
  7. 구성 속성> 링커> 입력> 추가 종속성 : 추가 gtestd.lib

모든 것이 작동하는지 확인

  1. main()함수가 포함 된 테스트 프로젝트에서 cpp를 엽니 다 .
  2. 다음 코드를 붙여 넣으십시오.

    #include "stdafx.h"  
    #include <iostream>
    
    #include "gtest/gtest.h"
    
    TEST(sample_test_case, sample_test)
    {
        EXPECT_EQ(1, 1);
    }
    
    int main(int argc, char** argv) 
    { 
        testing::InitGoogleTest(&argc, argv); 
        RUN_ALL_TESTS(); 
        std::getchar(); // keep console window open until Return keystroke
    }
    
  3. 디버그> 디버깅 시작

모든 것이 제대로 작동하면 콘솔 창이 나타나고 단위 테스트 결과가 표시됩니다.


9
훌륭한 가이드였습니다! 나는 공을 굴릴 수 있었지만 거기에 메모를 하나 더 추가 할 것입니다. 테스트 프로젝트와 gtest 라이브러리는 동일한 코드 생성 옵션으로 빌드되어야합니다. 둘 다 / MDd이거나 둘 다 / MTd입니다. 그렇지 않으면 연결 오류가 많습니다.
Kiril

1
참고 : Microsoft Visual Studio .Net 2003으로 이와 유사한 구현을 수행하려는 사람이 누구든지 Google 테스트 프레임 워크 라이브러리는 자동으로 런타임 라이브러리를 디버그 모드의 경우 ' 단일 스레드 디버그 '로 , 릴리스 모드의 경우 ' 단일 스레드 '로 기본 설정합니다. 내가 시도한 한 코드 생성에서 변경하는 옵션을 사용할 수 없습니다. 따라서 프로젝트의 런타임 라이브러리로 단일 스레드 옵션을 선택했는지 확인하십시오. 그 외에는이 간단하고 짧은 튜토리얼이 완벽하게 작동합니다!
Neophile 2011

이것은 효과가 있었지만 나쁜 습관을 장려하지 않은 5 개의 튜토리얼 중 첫 번째입니다. 이것이 테스트 프로젝트를 원래 프로젝트에 연결하는 중요한 측면을 다룬다면 좋겠습니다. 30 개 이상의 사이트가 나중에 작동하는 답을 찾지 못했습니다. 나는 그것에 3 일을 보냈다.
person27

나는 가치를 제거했다 "프로젝트 속성> 구성 속성> C / C ++> 런타임 라이브러리", 그것은 일
Manohar 레디 Poreddy을


5

gtest를 구축 한 후 이것이 내가 한 일입니다.

  1. Common Properties-> Linker-> General-> Additional Library Directories에 \ mypath \ gtest-1.0.1 \ Debug (또는 Release)를 추가합니다.
  2. 공통 속성-> 링커-> 입력-> 추가 종속성에 gtest.lib 및 gtest_main.lib를 추가합니다.

그 후 TEST 또는 TEST_F를 사용하여 테스트를 작성하고 주요 기능과 함께 컴파일합니다.

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

5
링커 오류가 많이 발생합니다 : 이미 gtest.lib에 정의 됨 ... 예 : 1> LIBCMT.lib (tidtable.obj) : error LNK2005 : __encode_pointer가 이미 msvcrt.lib (MSVCR80.dll)에 정의 됨 MFC 코드에 대한 테스트를 작성하려고합니다.
knaser

죄송합니다. 거기에서 당신을 도울 수 없을 것 같아요. 어떤 이유로 이러한 링크 오류가 발생하지 않습니다. gtest로 Hello World 테스트를 빌드 해 보셨습니까?
Arlaharen

gtest_main.lib기본 main함수 가 포함되어 있으므로 직접 작성한 경우에는 포함하지 않을 수 있습니다 main.
Groo

5

테스트를 위해 자신의 main ()을 작성하지 않으려면 gtest_main.lib에 정의 된 main () 함수를 사용할 수 있지만 VS2012에서 "Entry point must be defined"라는 링커 오류가 발생합니다. 테스트 프로젝트에서 ProjectProperties-> Linker-> System-> SubSystem을 "Console"로 설정하면 VS2012가 "main ()"이라는 진입 점을 찾게되고 gtest_main.lib에서 찾을 수 있습니다 (연결된 경우 제대로).


2

Microsoft Visual Studio에서 잘못 구성된 런타임 라이브러리 유형으로 인해 링크 오류가 발생합니다.

VS 2005 (및 2008)는 기본적으로 다중 스레드 DLL 또는 다중 스레드 디버그 DLL을 사용합니다. 그러나 Google 테스트 라이브러리는 기본적으로 Mulithreaded 또는 Mulithreaded 디버그 런타임을 사용합니다.

따라서 Google 테스트 라이브러리에 적합한 런타임 라이브러리 유형을 선택하십시오. (구성 속성-> 코드 생성-> 런타임 라이브러리).


적절한 런타임은 무엇입니까? (MD 또는 기타)
Ramadheer Singh

0

많은 오류, 수정하는 데 시간이 걸렸습니다.

다음은 간단한 단계입니다.

# https://github.com/google/googletest 에서 Googletest ZIP 파일을 다운로드합니다.

# Googletest 비주얼 스튜디오 솔루션

Open    C:\googletest\googletest\msvc\2010\gtest.sln
    Change "Solution configuration"
        from "Debug" to "Release"
    Build Solution
        creates gtest.lib

# 프로젝트 :

Project Properties > Configuration Properties > VC++ Directories > Include Directories
    append the following:       ;C:\googletest\googletest\include

Project Properties > Configuration Properties > Linker > General > Additional Library Directories > 
    append the following:           ;C:\googletest\googletest\msvc\2010\gtest\Win32-Release

Project Properties > Configuration Properties > C/C++ > Runtime Library
    Remove the value of the above. (or match it to Googletest project)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.