2025/06 6

[System programming] 헤더파일에 정의를 하면 안되는 이유

보통 헤더파일에 함수를 선언만하고 정의는 따로 cpp에서 한다. 그렇게 하지 않으면 링커 단계에서 오류가 뜰 수 있다. 예를들어 다음과 같은 상황을 보자A.h 라는 헤더파일에 void FuncA() { ... } 처럼 함수 정의가 들어있다.B.cpp, C.cpp 모두 A.h 를 include한다. 그리고 디버깅을 해보자. B.obj파일이나 C.obj파일에 이미 함수A가 정의되어 있다고하는 오류가 뜰 것이다. 분명 나는 정의를 한 헤더파일에 한번만 했는데 왜 오류가 뜰까 원리를 생각해보면, 다음과같다. 컴파일러는 B.cpp 를 처리하면서 A.h의 FuncA 정의를 보고 B.obj 에 FuncA의 기계어 코드(정의)를 생성한다. 이와같이 C.cpp를 처리하면서 C.obj에 FuncA의 기계어 코드(정의)를 ..

[Visual studio] HLSL Tool문제로 인해, hlsl코드 인식 안될 때

hlsli로는 float4같은 코드가 인식이 되는데, hlsl로 만들엇을때 아무리 설정을 잘 해줬어도 c++로 코드를 인식해버리는 경우가 있다. 이건 visual studio과 hlsl tools for visual studio가 잘 호환이 되지 않을 때 발생하는 문제이다. 해결방법은 extension-> manage extensions-> installed에서 Tim Jones라는 사람이 만든 HLSL Tools for Visual studio를 제거하고 새로운 버전을 다시 다운로드 해주면 된다. 새로운 버전을 먼저다운하면 여기서 HLSL Tools for Visual studio가 두개가 나타날 수 있는데 반드시 하나여야만 제대로 작동한다. 비쥬얼스튜디오 마켓플레이스에서 HLSL Tools치고 들어..

[Dx11] hlsl을 헤더파일로 컴파일 하는법

DX11에서는 런타임시 hlsl파일을 컴파일 하는 방식이 존재한다. D3DCompileFromFile과 같은 함수를 사용하는 것이다. 하지만 코드 길이가 길어지고, 배포시에는 보안상 사용될 수 없다. 이외의 방식에는 .cso로해서 빌드 시 객체 파일로 컴파일 하는 방식이 있고, 빌드 시 헤더 파일로 컴파일 하는 방식이 있다. 여기서는 빌드 시 헤더파일로 컴파일 하는 방식에 대해 알아 볼 것이다. visual studio내부에서 hlsl을 바이트 배열로 변환하고 그 값들을 헤더파일에 저장한다. 그리고 사용하면 된다. D3DCompileFromFile에서는 코드가 다음과 같은데,HRESULT hr = S_OK; // 컴파일된 셰이더 코드가 들어갈 blobID3DBlob* pPSBlob = nullptr..

[WinApi] dpi, dip와 렌더타겟 및 물리픽셀 이해

dpi와 dip에 대한 정확한 개념을 사실 완벽하게 이해하지는 못했다. 하지만 direct2d에서 이 개념이 어떻게 쓰이는지는 알아야 추후에 글자가 흐릿해지는 현상을 방지할 수 있다. dpi는 화면 1인치안에 물리적으로 몇개의 픽셀이 있는지를 뜻한다.96 DPI → 1인치에 96픽셀(기본값)192 DPI → 1인치에 192픽셀(200%확대) dip는 모든 디바이스에서 논리적으로 동일한 크기를 가지도록 설계된 단위이다directX에서 NDC좌표계하고 비슷한 개념이다. 디스플레이설정에서 배율 및 레이아웃을 들어가보면 뭐 150%(권장)이렇게 쓰여져 있는 것이 있을것이다. 그리고 고급 디스플레이 설정에 들어가면 본인 컴퓨터의 해상도가 있을것이다. 내꺼는 2560x1440이다. 이건 물리픽셀(정해진 크기의 픽셀..

[WinAPI] COM의 구조와 인터페이스 파헤쳐보기

Graphics (Direct2D)Text ,(DirectWrite),The Windows Shell,The Ribbon control,UI animation등은 Com(Component Object Model)을 기반으로 한다. Common Item Dialog는 Com기반으로 구현된 Windows Shell API인데, 구조를 코드로 파헤쳐보고자한다. 간단히 다음 코드를 보자.IFileOpenDialog* pFileOpen;// Common Item Dialog 객체 생성 및 IFileOpenDialog 인터페이스 포인터 획득hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, IID_IFileOpenDialog, reinterpret_cast..

[WinAPI] window state traking 및 window창 두개 띄우기

윈도우의 상태를 추적하려면 전역변수로 선언해서 winproc에서 상태를 조정하는 법이 있다. 하지만, 변수가 많아지거나 윈도우 창이 여러개가 되면 전역변수가 많아진다. 그렇다면, CreateWindowEx의 마지막 변수에 void*형식으로 만들어서 넣는 방법도 있다. 하지만 목적은 윈도우 창을 두개 띄우는 것이기 때문에 객체지향적으로 설계하고 싶다. 그러나, WNDCLASS wc = { 0 }; wc.lpfnWndProc = DERIVED_TYPE::WindowProc; .. RegisterClass(&wc);이 과정에서, WindowProc이 non-static이라면 오류가 발생한다. win32는 c API이다. 그래서 "함수 포인터 줘"라고 하지, "c++객체 줘"라고 말 안한다. 그래서 우회해서..