CMake 소개
CMake는 오픈 소스, 크로스 플랫폼 빌드 시스템입니다. 프로젝트의 빌드 과정을 자동화하고, 다양한 플랫폼과 컴파일러에서 일관된 빌드를 제공합니다. 오늘은 CMake를 사용하여 빌드 시스템을 관리하는 방법에 대해 학습하겠습니다.
CMake 기본 사용법
1. CMakeLists.txt 파일
CMake 프로젝트는 CMakeLists.txt
파일을 사용하여 구성됩니다. 이 파일에는 프로젝트 설정, 소스 파일 목록, 빌드 옵션 등이 포함됩니다.
간단한 예제
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
add_executable(my_executable main.cpp)
이 예제는 C++17 표준을 사용하는 간단한 프로젝트를 정의합니다. main.cpp
파일을 컴파일하여 my_executable
실행 파일을 생성합니다.
2. 빌드 디렉토리 생성 및 빌드
CMake를 사용하여 프로젝트를 빌드하려면 다음 명령어를 사용합니다.
mkdir build
cd build
cmake ..
make
이 명령어는 build
디렉토리를 생성하고, CMake를 사용하여 빌드 파일을 생성한 후, make
를 사용하여 프로젝트를 빌드합니다.
프로젝트 구조 관리
1. 소스 파일 구조
복잡한 프로젝트에서는 소스 파일을 디렉토리별로 분류하여 관리합니다. 예를 들어, 다음과 같은 프로젝트 구조를 가질 수 있습니다.
/MyProject
/src
main.cpp
my_class.cpp
my_class.h
CMakeLists.txt
CMakeLists.txt 파일
프로젝트 루트 디렉토리의 CMakeLists.txt
파일을 수정하여 하위 디렉토리를 포함합니다.
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
add_subdirectory(src)
src/CMakeLists.txt 파일
src
디렉토리에 CMakeLists.txt
파일을 생성하고 다음 내용을 추가합니다.
set(SOURCES
main.cpp
my_class.cpp
)
add_executable(my_executable ${SOURCES})
이 설정은 src
디렉토리의 소스 파일을 컴파일하여 my_executable
실행 파일을 생성합니다.
외부 라이브러리 사용
CMake를 사용하여 외부 라이브러리를 프로젝트에 포함하는 방법을 살펴보겠습니다.
1. FindPackage 사용
외부 라이브러리를 찾기 위해 find_package
명령어를 사용합니다. 예를 들어, Boost 라이브러리를 사용하는 경우 다음과 같이 설정할 수 있습니다.
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
find_package(Boost REQUIRED)
add_executable(my_executable main.cpp)
target_include_directories(my_executable PRIVATE ${Boost_INCLUDE_DIRS})
target_link_libraries(my_executable PRIVATE ${Boost_LIBRARIES})
이 설정은 Boost 라이브러리를 포함하고 링크합니다.
2. add_subdirectory 사용
소스 코드와 함께 제공되는 외부 라이브러리를 포함하려면 add_subdirectory
명령어를 사용합니다. 예를 들어, Google Test 라이브러리를 사용하는 경우 다음과 같이 설정할 수 있습니다.
프로젝트 구조
/MyProject
/src
main.cpp
/lib
/googletest
CMakeLists.txt
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
add_subdirectory(lib/googletest)
include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
add_executable(my_executable src/main.cpp)
target_link_libraries(my_executable gtest gtest_main)
이 설정은 Google Test 라이브러리를 포함하고 링크합니다.
조건부 컴파일 옵션 설정
CMake를 사용하여 조건부 컴파일 옵션을 설정하는 방법을 살펴보겠습니다.
1. 옵션 설정
CMake에서 컴파일 옵션을 설정하려면 option
명령어를 사용합니다.
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
option(USE_MY_FEATURE "Use my feature" ON)
if (USE_MY_FEATURE)
add_definitions(-DMY_FEATURE)
endif()
add_executable(my_executable main.cpp)
이 설정은 USE_MY_FEATURE
옵션을 설정하여 특정 기능을 포함할지 여부를 결정합니다. USE_MY_FEATURE
가 ON
으로 설정되면 -DMY_FEATURE
컴파일러 정의가 추가됩니다.
실습 문제
문제 1: CMake를 사용하여 외부 라이브러리 포함 및 빌드
다음 조건을 만족하는 CMake 프로젝트를 설정하세요.
- 프로젝트 구조
/MyProject /src main.cpp /lib /googletest CMakeLists.txt
- Google Test 라이브러리 포함 및 테스트 설정
해설:
- 프로젝트 구조 생성
mkdir -p MyProject/src
mkdir -p MyProject/lib
cd MyProject/lib
git clone https://github.com/google/googletest.git
- CMakeLists.txt 파일 작성
MyProject/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
add_subdirectory(lib/googletest)
include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
add_executable(my_executable src/main.cpp)
target_link_libraries(my_executable gtest gtest_main)
MyProject/src/main.cpp
#include <gtest/gtest.h>
TEST(SampleTest, Test1) {
EXPECT_EQ(1, 1);
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
- 프로젝트 빌드 및 테스트 실행
mkdir build
cd build
cmake ..
make
./my_executable
이제 Google Test를 포함하여 프로젝트를 빌드하고 테스트를 실행할 수 있습니다.
이제 25일차의 학습을 마쳤습니다. CMake를 사용하여 빌드 시스템을 관리하고, 외부 라이브러리를 포함하는 방법에 대해 학습하고 실습해보았습니다. 질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "C++로 네트워크 프로그래밍 (소켓 프로그래밍)"에 대해 학습하겠습니다.
'-----ETC----- > C++ 고급 프로그래밍과 응용 프로젝트 시리즈' 카테고리의 다른 글
[C++ 고급 프로그래밍과 응용 프로젝트 시리즈] Day 27: C++에서의 데이터베이스 연동 (SQLite, MySQL) (0) | 2024.08.01 |
---|---|
[C++ 고급 프로그래밍과 응용 프로젝트 시리즈] Day 24: gRPC를 이용한 분산 시스템 (0) | 2024.08.01 |
[C++ 고급 프로그래밍과 응용 프로젝트 시리즈] Day 22: Boost 라이브러리 소개 및 활용 (0) | 2024.08.01 |
[C++ 고급 프로그래밍과 응용 프로젝트 시리즈] Day 23: Qt를 이용한 GUI 프로그래밍 (0) | 2024.08.01 |
[C++ 고급 프로그래밍과 응용 프로젝트 시리즈] Day 20: 프로젝트 1 - 최적화 및 성능 테스트 (0) | 2024.08.01 |