CMake
개요
기존 Makefile를 조금 더 쉽고 편리하게 작성할 수 있는 툴로써, 프로젝트의 규모가 커짐에 따라 관리해야하는 소스 파일의 양이 많아지고, 의존성이 많이 생겨 소스 관리가 어려워지는 Makefile의 한계를 해결하기 위해 탄생하였습니다.
소스 코드와 결과물 사이의 추상화를 통해 프로젝트 관리가 쉬워지는 장점이 있음
"CMake는 프로젝트를 빌드하는 것이 아닌 빌드 스크립트 파일(Makefile)을 생성해주는 프로그램"
How to use
CMake를 사용하기 위해서는 가장 먼저 CMakeLists.txt를 작성해주어야 함
1.기본 CMakeLists.txt
CMakeLists.txt에는 반드시 CMake 최소 버전과 프로젝트 버전을 반드시 기재해 주어야 함
# 요구 CMake 최소 버전
cmake_minimum_required(VERSION 3.4)
# 프로젝트 이름 및 버전
project(CMAKE_BASIC)
set(PROJECT_VERSION_MAJOR 0)
set(PROJECT_VERSION_MINOR 1)
CMake 기본 템플릿
# 요구 CMake 최소 버전
cmake_minimum_required(VERSION 3.4)
# 프로젝트 이름 및 버전
project(CMAKE_BASIC)
set(PROJECT_VERSION_MAJOR 0)
set(PROJECT_VERSION_MINOR 1)
# 빌드 형상(Configuration)
set(CMAKE_BUILD_TYPE Release)
# C / C++ 표준 명시
set(CMAKE_CXX_STANDARD 11)
# 공통 컴파일 옵션, 링크 옵션
add_compile_options( -g -Wall )
set(CMAKE_EXE_LINKER_FLAGS "-static -Wl,--gc-sections")
# 공통 전처리기 매크로 정의(-D)
add_definitions( -D<매크로> -D<매크로> -D<매크로>=값 ... )
# 공통 헤더 파일 Include 디렉토리 (-I)
include_directories(include)
# 공통 링크 라이브러리 (-l)
#link_libraries( <라이브러리> <라이브러리> ... )
# 공통 링크 라이브러리 디렉토리 (-L)
# 가끔 링킹하려는 lib의 path를 찾지 못해 build fail이 발생하여 link_directories를 사용해야하는 경우가 있는데 link_directories는 최대한 사용하지 않는 것이 좋음
# 대신 link_libraries에 절대경로를 지정하여 link
#link_directories ( <디렉토리> <디렉토리> ... )
# <example>
# link_libraries( test ) // 기존 libtest.so 라는 lib linking 방법
#
# link_libraries( /usr/lib/libtest.so ) // 절대 경로를 통해 linking 방법
#
# cmake 부터 추가된 기능으로서 해당 이름의 package를 찾음
# REQUIRED 옵션의 경우 해당 package를 찾지 못한 경우, error를 발생시킴
# find_package(LAPACK REQUIRED)
# NAMES 뒤 인자로 넘겨준 이름을 가진 lib을 PATHS에서 search
# find_library(Vulkan_LIBRARY NAMES vulkan-1 vulkan PATHS ${CMAKE_SOURCE_DIR}/libs/vulkan)
# cmake 기반 sub_directory를 빌드 하기 위해서는 add_subdirectory를 통해 sub_dir 추가
# add_subdirectory(example)
# 빌드 소스 파일 목록
set(LIB_SRC hello.c)
add_library(Hello SHARED ${LIB_SRC})
set(SRC main.c)
add_executable(HelloSample ${SRC})
target_link_libraries(HelloSample Hello)
# 출력 디렉토리
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BUILD_TYPE}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BUILD_TYPE}/lib)
300x250