만약 이 글을 읽고 있는 사람이 CMAKE를 알고 있다면 큰 문제가 발생하지는 않는다.
CMAKE에서 OS, 컴파일러종류, 아키텍처 종류를 전부 다 손쉽게 알 수 있고, 전처리문을 만들어 주기도 한다.
먼저 제일 궁금한 부분은 OS의 종류를 파악하는것. 이라고 생각을 한다.
제일 먼저 코드로 보여 주자면
애플의 컴퓨터에 설치가 되어 있는 C++ 컴파일러
GNUC 같은 경우에는 전처리 문으로 "__APPLE__" 이 선언이 되어 있다.
추가적으로 판별 문은 총 3가지 이며.
MAC, Windows, Linux 인지 체크를 하고 그 외에 모든것이 아닐경우 OTHERS로 판별하고, 컴파일을 중지한다.
#define문, #if문 은 전처리문 이다.
MAC에선 __APPLE__ 이 정의가 되어 있고.
Windows에선 _WIN64, _WIN32 가 정의가 되어 있다.
다른 계열은 테스트 해보진 못했지만 Ubuntu 계열은 __linux__ 가 실제로 존재 한다.
+ 추가적으로 WSL - Ubuntu (Windows Subsystem for Linux)에서 사용할 경우 __linux__ 로 잡혔다.
이후로는 컴파일러 종류 확인이다.
컴파일러 확인하는 구간은 마찬가지로 윈도우와 똑같이
전처리로 판단한다.
MSVC 에선 _MSC_VER
GNUC(gcc, g++) 에선 __GNUC__
윈도우의 gcc (MINGW)는 __MINGW32__ 또는 __MINGW64__ 이다.
그 외의 컴파일러는 llvm 같은 경우는 잘 모르겠지만 llvm 또한 GNUC 계열이라서 아마.. 될것이다. 확인 해보고 내용을 추가 할 예정이다.
왠만한 컴파일러는 GNUC 이므로 크게 문제는 없다.
마지막으로 아키텍처,
해당 프로그램이 몇 비트 프로그램인지 판별 하기 위한 로직이다.
아까 컴파일러의 전처리문을 보게 된다면 _WIN32, _WIN64의 컴파일러 전처리문을 보았을 것이다.
맞다. 그것은 비트 관련된 정보이다.
하나의 문제점? 하나의 실수 할 부분을 미리 알려 주자면
OS_WINDOWS에서 Win32로 선택 시 _WIN32 가 존재하고
WIN64로 할 경우 _WIN64 만 있는것이 아니라
_WIN32 도 선언이 되어 있다.
그래서 적용할 때 WIN64 부터 조건을 확인 해야 한다.
그 외에 컴파일러 기준으로 GNUC 로 확인을 하게 하였다.
위의 전처리문을 확인 하고 글쓴이의 컴퓨터 OS와, 컴파일러, 아키텍처를 알 수 있다.
MACOS에 GNUC를 사용하고 X64 컴퓨터이다.
이 것을 만약 윈도우에서 한다면
WINDOWS에 MSVC(MINGW)를 사용하고 xBit 컴퓨터 로 나올 것이다.
해당 코드 기반으로 크로스 플랫폼 프로그램을 작성 할 수 있다.
대표적인 예로.
void delay(int ms) {
#if OS_WINDOWS
Sleep(ms);
#elif OS_LINUX || OS_MAC
// 코드 간략화를 위해 생략.
system("sleep " + ms / 1000.0f);
#endif
}
이 처럼 전처리 문으로 하나의 함수, 여러개의 플랫폼을 지원 할 수 있도록 개발도 가능하다.
'차장님의 이야기' 카테고리의 다른 글
회전 행렬 증명 #2 (0) | 2020.05.15 |
---|---|
회전 행렬의 증명 #1 (0) | 2020.05.14 |
#5 기존까지 한 내용 요약 및 상태. (0) | 2020.05.02 |
Console Graphics Library #4, Namespace 어떻게 해야할까? (0) | 2020.05.01 |
Console Graphics Library #3 CMAKE로 빌드 시스템 구축 (0) | 2020.04.30 |