[Visual Studio] - Ctrl+F5 실행과, 직접 실행의 차이 (작업 디렉터리 설정) ▷ 프로그램이 사운드나 픽셀 스프라이트 등 외부 에셋을 사용하는 경우, 에셋의 경로를 설정해야 한다. 프로그래밍 언어와 상관 없이 많은 프로그램이 디스크에서 파일을 읽어올 때 파일 위치의 경로를 문자열로 전달해 파일을 Load한다. ▷ 이때 절대 경로가 아닌 상대 경로로 파일의 위치를 지정하는 경우가 보편적인 것 같다. 절대 경로로 설정해버리면 사용자가 프로그램을 정확한 위치에 둬야 하기 때문이다. 하지만 상대 경로의 문제는 어디를 시작 디렉터리로 생각하느냐에 따라 결과가 달라지기 때문에 주의를 기울여야 한다. ▷ 특히 디버깅을 하거나 Visual Studio에서 Ctrl + F5 단축키로 실행할 때는 잘 되는데, 빌드된 결과물(exe)을 더블 클릭하면 에셋을 불러오지 못하는 경우가 있다. 왜냐하면 전.. 2025. 1. 3. [C/C++] - SDL이 main 함수를 호출하는 원리 (0 A.D. 소스코드 분석) #1. SDL을 사용하는 게임은 왜 main으로 동작하는 것일까? ▷ 0 A.D. 오픈소스의 main 함수는 위와 같이 extern "C"가 붙어 있다. 링크 단계에서 C 스타일로 컴파일하라는 키워드다. 그래서 C++의 다른 함수들과 달리, 이 키워드가 붙은 함수는 네임 맹글링(name wangling)을 하지 않는다. ▷ 그런데 이 키워드를 main에 붙인 목적을 이해할 수 없었다. 왜냐하면 main 함수는 어차피 네임 맹글링을 하지 않기 때문이다. 따라서 굳이 extern "C" 키워드를 붙일 이유가 전혀 없다. 그런데 나중에 알고보니 0 A.D. 게임은 그래픽 라이브러리로 SDL을 사용하기 때문이라는 것을 알게 되었다. ▷ 실제로 헤더 파일에는 위와 같이 애플리케이션의 진입점은 반드시 main.. 2025. 1. 2. [C/C++] - 크로스 플랫폼 오픈소스 라이브러리에서 OS 종속적인 부분은 어떻게? (공부 중...) ▷ SDL과 같은 오픈소스 프로젝트를 보면 대부분 하나의 [src] 폴더 안에 소스코드를 넣고, 빌드를 위해서는 따로 [build]나 [workspace] 폴더에서 빌드를 도와주는 시스템을 개별적으로 제공해준다. 예를 들어, Windows에서 빌드하고 싶다면 sln 파일이 있어서 더블클릭하면 자동으로 Visual Studio에서 열어서 즉시 빌드할 수 있다. ▷ 신기한 것은 어떤 라이브러리든 간에, 언젠가는 하부 구조에 플랫폼 종속적인 라이브러리가 등장할 수 밖에 없다. Windows라면 SDL에서 3d처리를 DirectX에 의존할 것이다. Mac이라면 Cocoa라는 플랫폼 종속적인 그래픽 라이브러리가 있다고 한다. ▷ vcxproj 파일(VC, Windows)이나, pbxproj(XCode, MacOS.. 2025. 1. 1. [Windows] - 콘솔 앱과 GUI 앱을 더블클릭하면 과연 어떤 차이가? #1. 콘솔 앱이 갑자기 뜨고 갑자기 사라지는 이유 ▷ Visual Studio에서 C/C++ 파일을 빌드하면 실행 파일(exe)이 생성된다. Visual Studio에서 Ctrl+F5로 실행할 수도 있지만, 빌드 디렉터리에 직접 찾아가 생성된 exe 파일을 더블클릭해도 된다. 하지만 콘솔 애플리케이션일 경우, 갑작스럽게 콘솔 창이 뜨고 사라지는 모습만 휑하니 보게 된다... ▷ 콘솔 창을 열고 거기서 직접 exe를 실행해야만 콘솔 창이 사라지지 않고 아래처럼 정상 실행되는 모습을 볼 수 있다. ▷ 그러나 GUI로 빌드한 Windows 애플리케이션은 더블클릭하면 콘솔이 열리고 닫히는 것이 아니라 처음부터 윈도우 창이 생성되어 실행된다. 마치 Windows가 똑같은 exe 파일인데도 무엇이 콘솔이고 무엇.. 2025. 1. 1. [C/C++] - int main() 함수에 extern "C" ?? ▷ 내가 요즘 분석하고 있는 오픈소스 0 A.D 게임의 main.cpp 진입점 함수를 보면 아래와 같이 적혀 있다. ▷ 왜 진입점인 int main()에 extern "C"가 붙었지...? 내가 알기론 C++ 컴파일러는 main과 같은 진입점 함수에는 네임 맹글링을 하지 않을 뿐더러, 외부에서 main을 호출할 모듈이 따로 있는 것 같지도 않은데 왜 extern "C"가 main에 붙었을까..... - 오늘부로 문제 해결.. - 이 문제는 따로 포스팅했다 : 아래 링크~~!![C/C++] - SDL이 main 함수를 호출하는 원리 (0 A.D. 소스코드 분석) [C/C++] - SDL이 main 함수를 호출하는 원리 (0 A.D. 소스코드 분석)#1. SDL을 사용하는 게임은 왜 main으로 동작하는 .. 2024. 12. 31. [C/C++] - executable 파일에 dllexport를 쓸 수 있는가. ▷ 0 A.D. 게임 프로젝트의 파일에 아래와 같은 코드가 있었다. main.cpp 파일은 그 이름이 임시하듯이 실행 파일(exe)로 빌드되도록 vcxproj 빌드 파일에 설정되어 있었다. ▷ 우선 이 코드 자체는 AMD나 NVIDIA가 개발한 그래픽 카드(전자는 라데온 시리즈, 후자는 RTX 시리즈가 유명하다)를 선택할 수 있도록 각 회사의 공식 문서에서 개발자에게 요구하는 코드다. 정확한 목적은 이 애플리케이션(게임)이 내장 그래픽 카드가 아니라 외장 그래픽 카드를 사용하도록 만드는 것이다. ▷ NVIDIA와 AMD에서 관련된 사항을 구글링해서 알아본 결과, 아래와 같이 Executable 파일에 코드를 삽입하면 런타임에 그래픽 카드 드라이버가 실행파일의 변수를 검색하여 그 값을 확인한 뒤에 내장.. 2024. 12. 31. [C언어] - 왜 long 타입은 windows에서만 32bit인가? ▷ C/C++ 표준 데이터 타입과 그 크기를 보자. Windows MSVC(Visual Studio)로 빌드한 결과다. - char (1byte) - short (2byte) - int (4byte) - long (4byte) ▷ 무언가 어색하다. 왠지 흐름 상 long은 8byte여야 자연스러운데.. 이상하게도 long은 int와 똑같은 4byte다... int가 4byte라면, 이름이 암시하듯 long은 8byte가 되어야 하지 않을까? 왜 굳이 int와 똑같은 타입으로 해석한 것일까? ▷ 놀랍게도 리눅스에서 컴파일하면 long은 직관적으로 기대하듯이 8byte다. 플랫폼마다 C언어 표준의 해석이 다르다는 것도 난감하지만, Windows가 long과 int를 똑같이 해석한다는 것이 더 이상하다. ▷ .. 2024. 12. 29. [Visual Studio] - 팁) 환경변수에 등록하지 않고 VS 도구 사용하기 ▷ Visual Studio를 설치하면 여러 빌드 도구들을 제공해준다. MSBuild는 기본이고, 여기에 컴파일러(cl.exe), 링커(link.exe) 등이 있다. ▷ NMake와 같은 Make 기반의 빌드툴도 제공해준다. ※ Make는 빌드 프로그램인데, 보통 리눅스/유닉스 환경에서 MakeFile 이라는 설정 텍스트 파일을 기반으로 빌드를 하는 프로그램이다. 이걸 Windows에서도 비슷한 형식으로 지원해주기 위해 Microsoft가 만들어 Visual Studio와 함께 배포해준 것이다. ※ 다만 NMake는 Make와 사용 방법이 엇비슷할 뿐, 리눅스의 MakeFile과 내용이 다를 수 밖에 없다. 같은 MakeFile이라도 Windows의 NMake와 리눅스의 Make가 동시에 동작할 수.. 2024. 12. 28. [C언어] - 헤더 파일이 필요한 이유 ▷ C/C++에서는 헤더 파일이 필수다. 예전에 C를 처음 배울 때, 헤더 파일을 연결해야 거기에 선언된 함수를 가져다 쓸 수 있는 거라고 생각했다. 틀린 말은 아니지만 이 설명에는 중간 과정이 전부 생략된 것이 문제다. ▷ 헤더 파일을 연결하면 그 헤더 파일에 있는 함수 선언을 전처리기가 복사/붙여넣기 해준다. 그리고 이것을 컴파일러가 컴파일해서 오브젝트 파일로 만들어주는 것이다. Windows의 경우 COFF 포맷의 파일이 생성된다. 이 과정에서 과연 전처리기나 컴파일러가 헤더 파일에 선언된 함수에 대해 뭘 알고 있을까? ▷ 놀랍게도 전처리기나 컴파일러는 선언된 함수에 대해 알고 있는 것이 하나도 없다. 사실 이들은 함수의 내용에 관심이 없다. 예를 들어, 에 있는 printf() 함수를 썼다고 하.. 2024. 12. 27. 이전 1 2 3 4 ··· 16 다음