2014-11-30 1 views
1

Google 테스트를 사용하여 단위 테스트를 작성하는 C++ 프로젝트가 있습니다. 이 프로젝트는 잠시 동안 있었고 상당히 엉망이었습니다. 그래서 나는 단위 테스트를 시작한 다음 프로그램을 종료하는 주 기능의 시작 부분에 라인을 추가했습니다. 그런 다음 단위 테스트와 실제 응용 프로그램을 전환하기 위해이 행에 주석을 달고 주석을 제거합니다.Visual Studio에서 lnk.exe로 .lib 파일에서 특정 개체 제거 빌드 후 이벤트

코드를 사용할 때만 효과가 있었지만 지금은 두 가지 프로젝트와 .exe 파일, 실제 응용 프로그램과 테스트 용으로 toussa의 대답과 같은 적절한 방법으로이 문제를 해결하려고합니다. 여기 : Visual Studio C++: Unit test exe project with google test?

그래서 여기 일에 대한 그의 설명은 : Linking to multiple .obj for unit testing a console application

문제는 모든 .OBJ-파일이 주요 기능을 포함하여,이 라이브러리에 투입한다는 것이다. _main이 이미 정의되어 있으므로 내 testmain과 링크 할 수 없게됩니다. 나는 명령에 "/ 제거"옵션을 추가했는데, 그래서는 다음과 같습니다 mainfile.cpp이 mainfile.obj을 컴파일

lib /NOLOGO /OUT:"$(TargetPath).lib" /REMOVE:"$(ProjectDir)$(Configuration)\mainfile.obj" "$(ProjectDir)$(Configuration)\*.obj" 

, 나는 희망한다. LNK의 출력은 다음과 같습니다 그들은 쓰기 http://msdn.microsoft.com/en-us/library/5ff8sk86(v=vs.100).aspx

:

LINK : warning LNK4014: cannot find member object C:\dev\solutions\currentSolution\currentProject\Debug\mainfile.obj 

유일한 것은 내가 여기에서하고있는 객체 파일의 이름을 작성하는 방법에 대해 발견

해당/REMOVE 및/EXTRACT 옵션에는 파일에 삭제되거나 복사 될 구성원 개체의 전체 이름이 필요합니다. 전체 이름에는 원래 오브젝트 파일의 경로가 포함됩니다. 라이브러리의 구성원 오브젝트의 전체 이름을 보려면 DUMPBIN/ARCHIVEMEMBERS 또는 LIB/LIST를 사용하십시오.

"C : \ dev \ solutions \ currentSolution \ currentProject \ Debug \ mainfile.obj"가 항목 중 하나 인 목록을 얻습니다.

내가 뭘 잘못하고 있니? 내가 뭔가 잘못 입력 한 곳이 있습니까? 아니면이 문제에 더 쉬운 해결책이 있습니까?

+2

입니다. 테스트 가능한 코드의 라이브러리, 라이브러리에 링크하는 메인 어플리케이션, 라이브러리에 링크하는 테스트 어플리케이션. –

+0

네, 그 해결책도 시도했지만,이 프로젝트를 작성한 이전 사람들 때문에 모든 코드가 함께 만들어졌습니다. 모든 것은 stdafx.h를 포함하고 있습니다. "클래스"는 상속하지 않지만 형식 변수를 검사하고 "하위 클래스"의 정적 메서드를 호출합니다.이 메서드는 숫자 매개 변수를 확인하고 해당 하위 클래스의 전역 배열에서 올바른 개체를 찾은 다음 마지막으로 올바른 메서드를 호출합니다 . 이 엉망진창을 풀다가 다른 프로젝트에서 내 테스트를 수행하는 데 필요한 바로 가기를 찾고 싶습니다. – MrBerta

+0

그럼. 응용 프로그램을 라이브러리로 변경하고'main'을'ApplicationEntry'로 이름을 바꾸거나 새로운 응용 프로그램 프로젝트에서'main'을 호출하십시오.다음 개발자가 유지하기 어려운 또 다른 요소를 도입하는 것보다 최소한의 리팩터링과 두통이 적습니다. –

답변

0

Google 테스트를 사용하여 콘솔 응용 프로그램의 단위 테스트를 작성하는 동안 정확히 동일한 문제가 발생했습니다. post-build 액션 int를 두 개의 개별 lib 호출로 나누어서 해결했습니다. 처음에는 모든 * .obj 파일에서 lib를 빌드합니다. 두 번째 호출은 * .lib 파일에서 main 함수가있는 * .obj 파일을 제거합니다. 전화 번호는

lib /NOLOGO /OUT:"$(TargetPath).lib" "$(ProjectDir)$(Configuration)\*.obj" 
lib /NOLOGO "$(TargetPath).lib" /REMOVE:"$(ProjectDir)$(Configuration)\mainfile.obj" 
+0

나는 Captain Obvlious advice를 따라 프로젝트를 세 부분으로 나눴습니다 : 실제 코드를 가진 라이브러리 프로젝트, 테스트 프로젝트, 그리고 라이브러리에서 exe 파일을 생성하는 작은 프로젝트. 이것은 거의 3 년 동안 잘 진행되어 왔고 다른 프로젝트에서도이 작업을 반복했습니다. 새로운 사람들에게 설명하기가 매우 쉽습니다! – MrBerta

관련 문제