개발/코더 탈출

CMake를 이용한 C++ 크로스 플랫폼 개발

-=HaeJuK=- 2025. 11. 17. 15:26
728x90
반응형
CMake를 이용한 C++ 크로스 플랫폼 개발

🚀 CMake를 이용한 C++ 크로스 플랫폼 개발

이 문서는 리눅스, 윈도우, macOS를 지원하는 C++ 프로젝트를 CMake로 구축하는 방법을 다룹니다.


I. CMake 기초: Hello World!

CMake의 핵심 3단계(Configure, Build, Run)를 보여주는 가장 기본적인 예제입니다.

1. 프로젝트 구조

HelloWorld/
├── CMakeLists.txt
└── main.cpp

2. CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(HelloWorld CXX)

# C++ 표준 설정
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 실행 파일 정의: main.cpp를 컴파일하여 'hello_world' 생성
add_executable(hello_world main.cpp)

3. 빌드 명령어 (모든 OS 공통)

# 1. 빌드 디렉토리 생성 및 설정 (Configure)
mkdir build
cd build
cmake .. 

# 2. 컴파일 (Build)
cmake --build .

II. OS별 분기 처리 (조건부 매크로)

CMake 변수를 사용하여 OS 정보를 C++ 코드로 전달하여 플랫폼별 메시지를 출력하는 방법입니다.

1. CMake를 통한 조건부 정의

# 실행 파일 타겟 정의
add_executable(conditional_app main.cpp)

# OS 감지 및 컴파일러에 매크로 전달
if(WIN32)
    target_compile_definitions(conditional_app PUBLIC IS_WINDOWS)
elseif(APPLE)
    target_compile_definitions(conditional_app PUBLIC IS_MACOS)
elseif(UNIX)
    target_compile_definitions(conditional_app PUBLIC IS_LINUX)
endif()

2. C++ 코드 (`main.cpp`)에서의 활용

int main() {
    #ifdef IS_WINDOWS
        std::cout << "Windows 환경입니다." << std::endl;
    #elif defined(IS_MACOS)
        std::cout << "macOS 환경입니다." << std::endl;
    #elif defined(IS_LINUX)
        std::cout << "Linux 환경입니다." << std::endl;
    #endif
    return 0;
}

III. 플랫폼별 구현 파일 (IMPL 폴더) 분리

특정 OS에 종속된 로직을 별도의 폴더에 두고, CMake가 조건부로 해당 파일만 빌드에 포함시키도록 설정합니다.

1. 프로젝트 구조

ProjectRoot/
├── main.cpp
├── interface.h
└── IMPL/
    ├── Linux/
    │   └── platform_impl.cpp
    └── Windows/
        └── platform_impl.cpp
    # ... Mac/ 등

2. CMakeLists.txt 핵심 로직

# 1. 공통 소스 정의
set(COMMON_SOURCES main.cpp)
set(PLATFORM_IMPL_SOURCE "") # OS별 구현체 경로 변수

# 2. OS 감지 및 구현체 파일 경로 설정
if(WIN32)
    set(PLATFORM_IMPL_SOURCE "IMPL/Windows/platform_impl.cpp")
elseif(APPLE)
    set(PLATFORM_IMPL_SOURCE "IMPL/Mac/platform_impl.cpp") # Mac 폴더가 있다면
elseif(UNIX)
    set(PLATFORM_IMPL_SOURCE "IMPL/Linux/platform_impl.cpp")
else()
    message(FATAL_ERROR "Unsupported OS detected!")
endif()

# 3. 실행 파일 정의: 공통 파일 + OS별 파일 결합
add_executable(app_with_impl
    ${COMMON_SOURCES}
    ${PLATFORM_IMPL_SOURCE}
)

# 4. 헤더 파일 경로 추가 (interface.h가 있는 폴더)
target_include_directories(app_with_impl PRIVATE .) 

3. 동작 원리 요약

단계 설명
**CMake 역할** if(WIN32) 등으로 OS를 감지하여 PLATFORM_IMPL_SOURCE 변수에 **하나의 파일 경로만** 할당합니다.
**빌드 역할** add_executable() 명령에 의해 오직 그 하나의 파일만 컴파일러에 전달됩니다.
**C++ 역할** main.cppinterface.hRunPlatformLogic()을 호출하며, 링크 과정에서 연결된 플랫폼별 구현체가 실행됩니다.
728x90