반응형

Visual Studio에서 google test를 돌리고 있는데

분명 활성화돤 Test Fixture들이 있음에도 아래처럼 테스트 탐색기에서 테스트 코드를 인식하지 못하는 상황이 발생했다.

테스트 출력 코드를 보니 오류 내용이 있다.

 

Visual Studio 2015 의 테스트 탐색기 창

 

아래는 테스트 출력

------ 테스트 검색 시작 ------
테스트 실행에서는 프레임워크 Framework45 및 플랫폼 X86용으로 작성된 DLL을 사용합니다. 다음 DLL은 실행에서 사용할 수 없습니다. 
..., gtest.exe은(는) 프레임워크 None 및 플랫폼 X64용으로 작성되었습니다.
. 이러한 설정을 관리하는 방법에 대해 자세히 알아보려면 http://go.microsoft.com/fwlink/?LinkID=236877&clcid=0x409을(를) 참조하십시오.
[20:34:09.483] Google Test Adapter: Test discovery starting...
[20:34:09.624 ERROR] Could not list test cases of executable 'gtest.exe': executing process failed with return code -1073741515
Command executed: 'gtest.exe --gtest_list_tests', working directory: ''
Command produced no output
[20:34:09.625] Found 0 tests in executable gtest.exe
[20:34:09.625] Test discovery completed, overall duration: 00:00:00.1412631
[20:34:09.625 ERROR] 
================
The following warnings and errors occured during test discovery (enable debug mode for more information):
[20:34:09.624 ERROR] Could not list test cases of executable 'gtest.exe': executing process failed with return code -1073741515
Command executed: 'gtest.exe --gtest_list_tests', working directory: ''
Command produced no output
========== 테스트 검색 완료: 0개 찾음(0:00:00.2912214) ==========

 

gtest 프로젝트를 실행시키니 실행되지 않는다.

DLL 문제였다. 

 

테스트 출력을 보니 gtest의 테스트들을 visual studio가 어떻게 인식하는지 알겠다.

gtest.exe가 우선 정상 동작해야한다. 약속된 인자를 통해 테스트 함수들의 정보를 받는것 같다.

 

참고로 최근에 추가한 fixture가 런타임에 특정 DLL을 로딩하려고 했지만

gtest의 working directory에 없어서 오류가 발생했다.

DLL의 invalid architeture 문제도 있었는데 그건 전처리기에 문제였고 모두 잘 해결했다.

( 최근에 추가한 오픈소스가 cmake로 자동 생성한 전처리기인데 x64 모듈임에도 WIN32가 붙어 있어서 문제였다..)

 

테스트 출력 오류 로그를 통해 덤으로 gtest 인자도 알게 되었다(?). 찾던 기능이였는데 gtest.exe 인자를 통해 원하는 fixture를 실행할 수 있는것 같다.

반응형
반응형
class SessionImpl;

class Session
{
public:
    Session() = default;
    virtual ~Session() = default;
private:
    std::unique_ptr<SessionImpl> pImpl_;
};

이 코드를 빌드하면 visual studio 에서 아래 오류가 발생한다.

 

오류 C2027 정의되지 않은 형식 'SessionImpl'을(를) 사용했습니다. 
경고 C4150 불완전한 형식 'SessionImpl'에 대한 포인터를 삭제했습니다. 소멸자가 호출되지 않습니다. 
오류 C2338 can't delete an incomplete type 

이유는 SessionImpl 이 전방선언되어 있고 Session의 생성자/소멸자가

SessionImpl의 정의를 알 수 없기 때문이다.

 

Session의 ctor와 dtor 를 default 키워드를 사용해 정의를 생략했는데,

이 경우 Session.cpp에서 SessionImpl.h를 include 하더라도 위 오류가 발생한다.

 

Session의 ctor와 dtor 정의 앞에 SessionImpl의 정의가 오면된다.

 

Session.h 는 아래 처럼 default를 제거하고

class SessionImpl;

class Session
{
public:
    Session();
    virtual ~Session();
private:
    std::unique_ptr<SessionImpl> pImpl_;
};

Session.cpp 에 ctor와 dtor 정의를 작성하면 자연스럽게 해결된다.

#include "Session.h"
#include "SessionImpl.h"

Session::Session()
{
}
Session::~Session()
{
}

정리해보면 pimpl 관용구의 이점을 위해 전방선언했지만, ctor/dtor를 default 키워드로 정의하다보니 발생한 오류이다.

pimpl 관용구의 사용목적상 전방선언을 유지하기 위해 ctor/dtor의 default키워드를 사용하지 않으면되는 문제다.

 

 

번외로, Visual Studio 오류 창에서 C2338 can't delete an incomplete type 를 따라 들어가보면

memory 헤더에서 assert 된 지점을 볼 수 있는데

 

이 부분에서 unique_ptr의 소멸처리 구현부가 sizeof(_Ty)를 통해 사이즈를 확인하므로

템플릿 인자의 정의 유무를 체크하는 부분이 재밌것 같다.

	// TEMPLATE CLASS default_delete
template<class _Ty>
	struct default_delete
	{	// default deleter for unique_ptr
	constexpr default_delete() _NOEXCEPT = default;

	template<class _Ty2,
		class = typename enable_if<is_convertible<_Ty2 *, _Ty *>::value,
			void>::type>
		default_delete(const default_delete<_Ty2>&) _NOEXCEPT
		{	// construct from another default_delete
		}

	void operator()(_Ty *_Ptr) const _NOEXCEPT
		{	// delete a pointer
		static_assert(0 < sizeof (_Ty),
			"can't delete an incomplete type");
		delete _Ptr;
		}
	};

 

 

참고 : 

https://stackoverflow.com/questions/44633726/circular-dependency-cant-delete-an-incomplete-type

반응형
반응형

VirtualBox 실행시 이런창이 뜬다면

Windows에 Hyper-V 기능이 켜져있는지 확인해보세요

 

 

제어판 > 프로그램 및 기능 > Windows 기능 켜기/끄기

Hyper-V를 언체크하신 뒤 확인을 누르신 뒤 재부팅

 

또는

 

1) cmd 관리자 권한으로 실행

2) bcdedit /set hypervisorlaunchtype off

3) 재부팅

반응형
반응형

전문가를 위한 c++ 개정4판 읽던 도중 내용이 잘못된것 같아 오탈자 등록을 했다.

https://www.hanbit.co.kr/store/books/look.php?p_code=B3215427289 

 

전문가를 위한 C++(개정4판)

C++는 마스터하기 어렵기로 악명 높지만 풍부한 기능 덕분에 게임이나 상용 소프트웨어 애플리케이션을 개발하는 대표 언어로 자리매김했다. 숙련된 C++ 프로그래머조차 잘 모르는 고급 기능도

www.hanbit.co.kr

 

string_view의 remove_prefix와 remove_suffix동작이 스트링을 축소하려면 시작포인터를 뒤로 보내고 끝포인터를 앞으로 당겨야 하는데, 포인터를 보내는 방향이 반대로 써있는것 같아서 내용 확인 요청을 작성했다.

 

책 내용이 많다보니 단순 실수인것 같다.

 

처음에는 옮긴이에게 메일을 보내야하나 하다가, 한빛은 오탈자등록이 가능해서 남겨봤다.

 

확인 진행중인게 6건정도 더 있었는데 작년것들도 몇개 있어서 확인되려면 오래걸릴것 같다

 

그래도 다른 플랫폼들은 하지 않는 오탈자 등록을 제공하는 한빛이 독자 입장에선 고마운것 같다.

 

 

 

 

 

[2022-06-17 내용추가]

오랜만에 접속해보니 등록했던 오탈자가 확인되었습니다.

도움이된것 같아 다행입니다.

반응형

+ Recent posts