SlideShare a Scribd company logo
cmake 튜토리얼
이상문
목차
• 소개
• 목표
• 사용법
• 주요 명령, 매크로, 함수
• 중요 변수
• Example
소개
• 기존의 유닉스 기반 환경에서의 autotools와 견주어지는 빌드 시스템.
• C/C++ 프로그램을 주로 대상.
• Linux 및 유닉스 계열, OS X, Windows 지원.
• 유닉스 계열은 Makefile 과 관련 파일이 결과물로 나옴.
• Windows는 .sln 파일 및 관련 파일이 결과물로 나옴.
• OS X는 Makefile 과 관련 파일이 나올 것으로 예측.(경험이 없음)
목표
• 라이브러리 파일을 만든다.
• 앞서 만든 라이브러리와 링크하여 실행 파일을 만든다.
사용법
• cmake 프로세스는 두 가지로 구성
▫ 환경 설정
 cmake -S . -Bbuild
 -S는 source가 위치한 곳을 지정. C++ sourc가 아니라 CMakeLists.txt
 -B는 build 관련 파일들이 생성되는 곳을 지정. Source 위치와 build 위치는 분리되는 것이 좋다.
▫ 빌드
 cmake --build build
• 사용법은 cmake --help 와 다음 사이트를 참조
▫ https://cmake.org/cmake/help/v3.14/manual/cmake.1.html
주요 명령, 매크로, 함수(1)
• cmake_minimum_required (VERSION 2.6)
▫ cmake script의 호환성을 위한 설정. 현재 최신 버전 3.14
• Project (Tutorial)
▫ 프로젝트 명 표기. IDE에서는 이것으로 프로젝트명을 일반적으로 사용.
• add_executable(programName main.cpp)
▫ main.cpp를 컴파일 및 링크해서 programName이라는 실행파일을 만든다.
• add_library(libraryName SHARED|STATIC lib.cpp)
▫ lib.cpp를 컴파일 및 링크해서 라이브러리 파일을 만든다.
▫ SHARED를 사용하면 liblibraryName.so(유닉스 계열), libraryName.lib/dll(윈도우)이 출력.
▫ STATIC을 사용하면 liblibrary.a(유닉스 계열), libraryName.lib(윈도우)가 출력
주요 명령, 매크로, 함수(2)
• include
▫ 예: include(OpenSSL)  윈도우의 경우, C:Program FilesCMakesharecmake-
3.13Modules 위치에 있는 FindOpenSSL.cmake 가 포함되는 것으로 확인된다.
• find_package
▫ 예: find_package(OpenSSL)  FindOpenSSL.cmake 에 등록된 함수들을 실행해서, 관련
변수들의 값을 찾는다.
▫ OPENSSL_INCLUDE_DIR 와 OPENSSL_LIBRARIES 값이 생성됨.
▫ 생성된 변수값을 이용하여, target_include_directories, target_link_libraries 등에 사용.
주요 명령, 매크로, 함수(3)
• target_link_libraries
▫ 예: target_link_libraries(Tutorial ${OPENSSL_LIBRARIES})
▫ Target인 Tutorial을 생성할 때, OPENSSL_LIBRARIES 에 설정된 값으로 링크한다.
참고) Target: add_executable() 혹은 add_library() 를 사용할 때의 설정값
• target_include_directories
▫ 예: target_include_directories(Tutorial PRIVATE ${OPENSSL_INCLUDE_DIR})
▫ Target인 tutorial의 Include 검색 경로로 추가한다.
참고) private, public: private 은 현재 target 전용, public 은 현재 target 뿐만 아니라, 이
target을 사용하는 project에도 표출시키는 역할로 이해함.
주요 명령, 매크로, 함수(4)
• add_subdirectory
▫ 예: add_subdirectory(moduleTest)
▫ moduleTest 라는 하위 디렉토리의 CMakeLists.txt를 함께 포함해서 실행한다.
▫ 여러 프로젝트를 한번에 빌드할 때 유용
▫ 상위 디렉토리의 설정값이 유지되어 전달된다. 즉, 상위에서 find_package 등을 통해 얻는 값을 하
위 디렉토리에서 그대로 사용 가능.
• message
▫ 예: message("OPENSSL_INCLUDE_DIR="${OPENSSL_INCLUDE_DIR})
▫ cmake 설정 중 화면에 메시지를 출력.
▫ cmake 설정 중간에 값을 확인해보는 용도로 많이 사용하고 있음.
주요 명령, 매크로, 함수(5)
• install
▫ 유닉스 계열의 경우, 최종적으로 make의 install target에 반영하는 것으로 보임.
▫ 윈도우의 경우, INSTALL.vcxproj 파일이 생성되는데, 이것에 영향을 주는 것으로
보임.
▫ 예: install(TARGETS first LIBRARY DESTINATION ${CMAKE_SOURCE_DIR}/lib
ARCHIVE DESTINATION ${CMAKE_SOURCE_DIR}/lib)
▫ LIBRARY는 .so 파일을 의미, ARCHIVE는 .a 나 .lib 파일을 의미
▫ 윈도우에서 .dll 파일 설치를 위해서는 RUNTIME을 사용
중요 변수(1)
• CMAKE_MODULE_PATH
▫ cmake 의 라이브러리가 설치된 위치라고 볼 수 있다.
▫ 사용자가 cmake 모듈을 만들었을 경우, 이 값에 추가하여 모듈에 대한 include 검색 경로를 추가할
수 있음.
▫ 예: set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
▫ 새롭게 만든 Findsecp256k1.cmake 파일이 cmake 디렉토리에 존재하게 되면,
include(Findsecp256k1)으로 모듈을 포함시킬 수 있다.
• CMAKE_CXX_STANDARD
▫ C++ standard를 지정할 수 있다.
▫ 예: set (CMAKE_CXX_STANDARD 11)  c++11 standard 로 컴파일함.
중요 변수(2)
• CMAKE_SOURCE_DIR
▫ cmake를 최초로 실행할 때 지정된 source의 위치
▫ 하위 디렉토리로 들어가게 되더라도 유지됨.
• CMAKE_CURRENT_SOURCE_DIR
▫ 현재 source의 위치
▫ 하위 디렉토리로 들어가게 되면 이에 맞춰 변경됨.
Example: 개발 환경
CMakeLists.txt
+---firstexec
| CMakeLists.txt
| main.cpp
|
---firstlib
CMakeLists.txt
firstlib.cpp
firstlib.h
cmake_minimum_required (VERSION 2.6)
project(cmake-tutorial)
add_subdirectory(firstlib)
add_subdirectory(firstexec)
CMakeLists.txt in root
디렉토리 구조
Example: firstlib
cmake_minimum_required (VERSION 2.6)
project(firstlib)
add_library(first STATIC firstlib.cpp)
install(TARGETS first
LIBRARY DESTINATION ${CMAKE_SOURCE_DIR}/lib
ARCHIVE DESTINATION ${CMAKE_SOURCE_DIR}/lib
)
install(FILES firstlib.h DESTINATION
${CMAKE_SOURCE_DIR}/include)
CMakeLists.txt in firstlib
#include "firstlib.h"
int add(int a, int b) {
return a+b;
}
firstlib.cpp in firstlib
#ifndef FIRSTLIB_H
#define FIRSTLIB_H
int add(int a, int b);
#endif //FIRSTLIB_H
firstlib.h in firstlib
Example: firstexec
cmake_minimum_required (VERSION 2.6)
project(firstexec)
add_executable(firstexec main.cpp)
target_link_libraries(firstexec first)
target_include_directories(firstexec
PRIVATE
${CMAKE_SOURCE_DIR}/firstlib)
install(TARGETS firstexec
RUNTIME DESTINATION ${CMAKE_SOURCE_DIR}/bin)
CMakeLists.txt in firstexec
#include <iostream>
#include <firstlib.h>
int main()
{
using namespace std;
cout << "from firstlib, " << add(10, 20) << endl;
return 0;
}
main.cpp in firstexec
Example 사용법
• 빌드 작업까지만
▫ cmake -S . -B build
▫ cmake --build build
• 설치 작업 포함
▫ cmake --build build --target install
• Example source code 위치는?
▫ https://github.com/moonyl/cmake-tutorial.git

More Related Content

PDF
cmake.pdf
PDF
helm 입문
PDF
Shell script en linux
PPT
Coding Standards & Best Practices for iOS/C#
PDF
CMake best practices
PDF
Helm - Application deployment management for Kubernetes
PPT
C++ Programming Course
PDF
CMake - Introduction and best practices
cmake.pdf
helm 입문
Shell script en linux
Coding Standards & Best Practices for iOS/C#
CMake best practices
Helm - Application deployment management for Kubernetes
C++ Programming Course
CMake - Introduction and best practices

What's hot (20)

PDF
2 2 open_ehr archetypes classes
PDF
Java 8 ​and ​Best Practices
PDF
Hands-on Helm
PPTX
Implementing DevOps
PPT
Google mock for dummies
PDF
Developing Rich Clients with the Eclipse 4 Application Platform
PDF
kubernetes - minikube - getting started
PPTX
Introduction to kubernetes
ODP
Java 9 Features
PPTX
Final terraform
PPTX
Spring cloud config
PDF
Gradle - the Enterprise Automation Tool
PPTX
Angular 6 Form Validation with Material
PDF
Object-oriented Programming-with C#
PPTX
Steering the Course with Helm
PPTX
Getting started with Jenkins
PPTX
Java 8 presentation
PPTX
Coding standard and coding guideline
PDF
Modern Monitoring [ with Prometheus ]
PDF
Kubernetes - A Comprehensive Overview
2 2 open_ehr archetypes classes
Java 8 ​and ​Best Practices
Hands-on Helm
Implementing DevOps
Google mock for dummies
Developing Rich Clients with the Eclipse 4 Application Platform
kubernetes - minikube - getting started
Introduction to kubernetes
Java 9 Features
Final terraform
Spring cloud config
Gradle - the Enterprise Automation Tool
Angular 6 Form Validation with Material
Object-oriented Programming-with C#
Steering the Course with Helm
Getting started with Jenkins
Java 8 presentation
Coding standard and coding guideline
Modern Monitoring [ with Prometheus ]
Kubernetes - A Comprehensive Overview
Ad

Similar to Cmake tutorial (20)

PDF
Kernel 2.6 makefile_분석(송형주)
PPTX
System+os study 4
 
PDF
Modern C++ 프로그래머를 위한 CPP11/14 핵심
PDF
JVM_트러블슈팅.pdf
PDF
linux1
PDF
Perl Script Document
PDF
망고100 보드로 놀아보자 11
PPTX
Linux in Visual Studio
PDF
[강릉원주대 대기환경과학과] 대기과학전산입문 설명서
PPTX
IoT with Raspberry Pi + Node JS - Chapter 1
PPTX
Kinect 사용을 위한 OpenCV, PCL 라이브러리 설치
PPTX
Pcl 라이브러리 빌드_튜토리얼
PDF
Debian packaging - basic process
PDF
JetsonTX2 Python
PPTX
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
PDF
청강대 특강 - 프로젝트 제대로 해보기
PPTX
shell and process
PDF
C 언어 스터디 01 - 기초
PDF
이호민 - 우분투 환경에서의 임베디드 개발환경 구축 및 어플리케이션 개발 (2010Y06M24D)
PDF
[IoT] MAKE with Open H/W + Node.JS - 2nd
Kernel 2.6 makefile_분석(송형주)
System+os study 4
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
JVM_트러블슈팅.pdf
linux1
Perl Script Document
망고100 보드로 놀아보자 11
Linux in Visual Studio
[강릉원주대 대기환경과학과] 대기과학전산입문 설명서
IoT with Raspberry Pi + Node JS - Chapter 1
Kinect 사용을 위한 OpenCV, PCL 라이브러리 설치
Pcl 라이브러리 빌드_튜토리얼
Debian packaging - basic process
JetsonTX2 Python
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
청강대 특강 - 프로젝트 제대로 해보기
shell and process
C 언어 스터디 01 - 기초
이호민 - 우분투 환경에서의 임베디드 개발환경 구축 및 어플리케이션 개발 (2010Y06M24D)
[IoT] MAKE with Open H/W + Node.JS - 2nd
Ad

Cmake tutorial

  • 2. 목차 • 소개 • 목표 • 사용법 • 주요 명령, 매크로, 함수 • 중요 변수 • Example
  • 3. 소개 • 기존의 유닉스 기반 환경에서의 autotools와 견주어지는 빌드 시스템. • C/C++ 프로그램을 주로 대상. • Linux 및 유닉스 계열, OS X, Windows 지원. • 유닉스 계열은 Makefile 과 관련 파일이 결과물로 나옴. • Windows는 .sln 파일 및 관련 파일이 결과물로 나옴. • OS X는 Makefile 과 관련 파일이 나올 것으로 예측.(경험이 없음)
  • 4. 목표 • 라이브러리 파일을 만든다. • 앞서 만든 라이브러리와 링크하여 실행 파일을 만든다.
  • 5. 사용법 • cmake 프로세스는 두 가지로 구성 ▫ 환경 설정  cmake -S . -Bbuild  -S는 source가 위치한 곳을 지정. C++ sourc가 아니라 CMakeLists.txt  -B는 build 관련 파일들이 생성되는 곳을 지정. Source 위치와 build 위치는 분리되는 것이 좋다. ▫ 빌드  cmake --build build • 사용법은 cmake --help 와 다음 사이트를 참조 ▫ https://cmake.org/cmake/help/v3.14/manual/cmake.1.html
  • 6. 주요 명령, 매크로, 함수(1) • cmake_minimum_required (VERSION 2.6) ▫ cmake script의 호환성을 위한 설정. 현재 최신 버전 3.14 • Project (Tutorial) ▫ 프로젝트 명 표기. IDE에서는 이것으로 프로젝트명을 일반적으로 사용. • add_executable(programName main.cpp) ▫ main.cpp를 컴파일 및 링크해서 programName이라는 실행파일을 만든다. • add_library(libraryName SHARED|STATIC lib.cpp) ▫ lib.cpp를 컴파일 및 링크해서 라이브러리 파일을 만든다. ▫ SHARED를 사용하면 liblibraryName.so(유닉스 계열), libraryName.lib/dll(윈도우)이 출력. ▫ STATIC을 사용하면 liblibrary.a(유닉스 계열), libraryName.lib(윈도우)가 출력
  • 7. 주요 명령, 매크로, 함수(2) • include ▫ 예: include(OpenSSL)  윈도우의 경우, C:Program FilesCMakesharecmake- 3.13Modules 위치에 있는 FindOpenSSL.cmake 가 포함되는 것으로 확인된다. • find_package ▫ 예: find_package(OpenSSL)  FindOpenSSL.cmake 에 등록된 함수들을 실행해서, 관련 변수들의 값을 찾는다. ▫ OPENSSL_INCLUDE_DIR 와 OPENSSL_LIBRARIES 값이 생성됨. ▫ 생성된 변수값을 이용하여, target_include_directories, target_link_libraries 등에 사용.
  • 8. 주요 명령, 매크로, 함수(3) • target_link_libraries ▫ 예: target_link_libraries(Tutorial ${OPENSSL_LIBRARIES}) ▫ Target인 Tutorial을 생성할 때, OPENSSL_LIBRARIES 에 설정된 값으로 링크한다. 참고) Target: add_executable() 혹은 add_library() 를 사용할 때의 설정값 • target_include_directories ▫ 예: target_include_directories(Tutorial PRIVATE ${OPENSSL_INCLUDE_DIR}) ▫ Target인 tutorial의 Include 검색 경로로 추가한다. 참고) private, public: private 은 현재 target 전용, public 은 현재 target 뿐만 아니라, 이 target을 사용하는 project에도 표출시키는 역할로 이해함.
  • 9. 주요 명령, 매크로, 함수(4) • add_subdirectory ▫ 예: add_subdirectory(moduleTest) ▫ moduleTest 라는 하위 디렉토리의 CMakeLists.txt를 함께 포함해서 실행한다. ▫ 여러 프로젝트를 한번에 빌드할 때 유용 ▫ 상위 디렉토리의 설정값이 유지되어 전달된다. 즉, 상위에서 find_package 등을 통해 얻는 값을 하 위 디렉토리에서 그대로 사용 가능. • message ▫ 예: message("OPENSSL_INCLUDE_DIR="${OPENSSL_INCLUDE_DIR}) ▫ cmake 설정 중 화면에 메시지를 출력. ▫ cmake 설정 중간에 값을 확인해보는 용도로 많이 사용하고 있음.
  • 10. 주요 명령, 매크로, 함수(5) • install ▫ 유닉스 계열의 경우, 최종적으로 make의 install target에 반영하는 것으로 보임. ▫ 윈도우의 경우, INSTALL.vcxproj 파일이 생성되는데, 이것에 영향을 주는 것으로 보임. ▫ 예: install(TARGETS first LIBRARY DESTINATION ${CMAKE_SOURCE_DIR}/lib ARCHIVE DESTINATION ${CMAKE_SOURCE_DIR}/lib) ▫ LIBRARY는 .so 파일을 의미, ARCHIVE는 .a 나 .lib 파일을 의미 ▫ 윈도우에서 .dll 파일 설치를 위해서는 RUNTIME을 사용
  • 11. 중요 변수(1) • CMAKE_MODULE_PATH ▫ cmake 의 라이브러리가 설치된 위치라고 볼 수 있다. ▫ 사용자가 cmake 모듈을 만들었을 경우, 이 값에 추가하여 모듈에 대한 include 검색 경로를 추가할 수 있음. ▫ 예: set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) ▫ 새롭게 만든 Findsecp256k1.cmake 파일이 cmake 디렉토리에 존재하게 되면, include(Findsecp256k1)으로 모듈을 포함시킬 수 있다. • CMAKE_CXX_STANDARD ▫ C++ standard를 지정할 수 있다. ▫ 예: set (CMAKE_CXX_STANDARD 11)  c++11 standard 로 컴파일함.
  • 12. 중요 변수(2) • CMAKE_SOURCE_DIR ▫ cmake를 최초로 실행할 때 지정된 source의 위치 ▫ 하위 디렉토리로 들어가게 되더라도 유지됨. • CMAKE_CURRENT_SOURCE_DIR ▫ 현재 source의 위치 ▫ 하위 디렉토리로 들어가게 되면 이에 맞춰 변경됨.
  • 13. Example: 개발 환경 CMakeLists.txt +---firstexec | CMakeLists.txt | main.cpp | ---firstlib CMakeLists.txt firstlib.cpp firstlib.h cmake_minimum_required (VERSION 2.6) project(cmake-tutorial) add_subdirectory(firstlib) add_subdirectory(firstexec) CMakeLists.txt in root 디렉토리 구조
  • 14. Example: firstlib cmake_minimum_required (VERSION 2.6) project(firstlib) add_library(first STATIC firstlib.cpp) install(TARGETS first LIBRARY DESTINATION ${CMAKE_SOURCE_DIR}/lib ARCHIVE DESTINATION ${CMAKE_SOURCE_DIR}/lib ) install(FILES firstlib.h DESTINATION ${CMAKE_SOURCE_DIR}/include) CMakeLists.txt in firstlib #include "firstlib.h" int add(int a, int b) { return a+b; } firstlib.cpp in firstlib #ifndef FIRSTLIB_H #define FIRSTLIB_H int add(int a, int b); #endif //FIRSTLIB_H firstlib.h in firstlib
  • 15. Example: firstexec cmake_minimum_required (VERSION 2.6) project(firstexec) add_executable(firstexec main.cpp) target_link_libraries(firstexec first) target_include_directories(firstexec PRIVATE ${CMAKE_SOURCE_DIR}/firstlib) install(TARGETS firstexec RUNTIME DESTINATION ${CMAKE_SOURCE_DIR}/bin) CMakeLists.txt in firstexec #include <iostream> #include <firstlib.h> int main() { using namespace std; cout << "from firstlib, " << add(10, 20) << endl; return 0; } main.cpp in firstexec
  • 16. Example 사용법 • 빌드 작업까지만 ▫ cmake -S . -B build ▫ cmake --build build • 설치 작업 포함 ▫ cmake --build build --target install • Example source code 위치는? ▫ https://github.com/moonyl/cmake-tutorial.git