티스토리 뷰
728x90
반응형
🚀 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.cpp는 interface.h의 RunPlatformLogic()을 호출하며, 링크 과정에서 연결된 플랫폼별 구현체가 실행됩니다. |
728x90
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 제주도
- 패턴
- C++
- 울릉도
- ip
- 성산블루버블
- 스쿠버다이빙
- Linux
- Thread
- OpenSource
- 디자인패턴
- 서귀포블루버블
- 블루버블다이빙팀
- 서귀포
- Windows
- Build
- DLL
- ReFS
- RSA
- 리눅스
- PowerShell
- 블루버블다이브팀
- C#
- 양파다이브
- 암호화
- 윈도우
- 현포다이브
- 블루버블
- C
- 다이빙
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
글 보관함
