2023년 9월 23일 토요일

Cross platform 대응 코드 작성

Preprocessor 사용

OS 를 구분할 수 있는 define 값이 미리 정의되어 C 컴파일러로 확인할 수 있다.

각 OS 마다 C 컴파일러에 제공하는 predefiend 값은 구글 검색 등을 통해 확인 할 수 있다.


팁) 또는 gcc 는 predefined macro 를 확인하는 기능을 제공한다

https://gcc.gnu.org/onlinedocs/cpp/System-specific-Predefined-Macros.html

 

e.g.) WSL 환경 (참고: 입력 종료 필요함 Ctrl+d)

$ gcc -dM -E - | grep linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
$ gcc -dM -E - | grep unix
#define __unix__ 1
#define __unix 1
#define unix 1

$ cpp -dM | grep linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
$ cpp -dM | grep unix
#define __unix__ 1
#define __unix 1
#define unix 1


팁) 그리고, Windows 는 predefined 값 정보를 제공하는 웹 페이지를 제공한다.

https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-170

e.g.) 


 

종합해 보면 아래와 같이 cross platform 대응 코드를 작성할 수 있다.

e.g.)

#if defined(__APPLE__) || defined(__MACH__) /* mac os x */

// mac os x code...

#elif defined(unix) || defined(__unix__) || defined(__unix) /* unix or linux */

// linux code...

#elif defined(_WIN32) || defined(_WIN64) /* windows */

// windows code...

#endif


단순 OS 구분 외에도 세부적인 차이점이 predefined 값으로 제공되며 필요시 각 메뉴얼을 찾아보기 바람.


주의할 점은 해당 OS 에 대한 부분만 컴파일되기 때문에 여러 OS 를 옮겨 가며 빌드하고 테스트 해야 하는 어려움이 있다.



비교: Cross Compiler

https://stackoverflow.com/a/1031347/5676460

Cross platform

동일한 기능이 여러 플랫폼에서 빌드 및 동일하게 실행 가능한 프로그램 또는 코드의 기능

Cross compiler

현재 컴파일러 외 다른 플랫폼에서 동작하는 코드를 생성하는 컴파일러. 임베디드 환경의 경우 반드시 cross compiler 를 제공해야 함.



댓글 없음:

댓글 쓰기