티스토리 뷰

CMake

[CMake 공부] Step 1: A Basic Point

권벡터 2025. 1. 2. 02:40

이 장에서 알 수 있는 것 

  • CMake의 기본 구문
  • CMake의 명령 및 변수에 대한 소개

연습 1: Building a Basic Project (기초  프로젝트 빌드하기) 

가장 기본적인 CMake 프로젝트는 단일 소스 코드 파일로 작성된 실행 파일이다. 이러한 간단한 프로젝트의 경우 세 가지 명령이 포함된 CMakeLists.txt 파일만 있으면 충분하다. 

 

1. cmake_minimum_required() 

어떤 프로젝트든 최상위 CMakeLists.txt 파일은 최소 CMake 버전을 지정하는 cmake_minimum_required() 명령으로 시작해야 한다. 이는 정책 설정을 확립하고 이후 CMake 기능이 호환 가능한 CMake 버전에서 실행되도록 보장한다. 

 

2. project()

프로젝트를 시작하려면 project() 명령을 사용하여 프로젝트 이름을 설정한다. 이 호출은 모든 프로젝트에서 필요하며 cmake_minimum_required() 뒤에 바로 호출되어야 한다. 이 명령은 언어나 버전 번호와 같은 다른 프로젝트 수준의 정보를 지정하는 데에도 사용할 수 있다.

 

3. add_executable()

지정된 소스 코드 파일을 사용하여 실행 파일을 만들도록 CMake에 지시한다. 

연습 1.1. CMakeLists.txt 편집 

튜토리얼 소스파일의 'Step1' 디렉토리에 들어가면 아래 이미지 처럼 3개의 파일이 있다. 

여기서 'CMakeLists.txt' 텍스트 파일을 연다. 

Step1 디렉토리 이미지

 

CMake 측에서 고맙게도 해당 텍스트 파일에 무엇을 입력해야하는지 주석을 남겨 주었다. 

연습 1에서는 TODO 1 ~ TODO 3 까지 코드를 작성하면 된다.

Step1 CMakeLists.txt 파일

 

필자는 아래와 같이 작성하였다. 

#TODO 1
cmake_minimum_required(VERSION 3.10)

#TODO 2 
project(Turorial)

#TODO 3 
add_executable(Tutorial tutorial.cxx)

 

연습 1.2. cmd 창에서 CMake 빌드하기

먼저  Cmake 튜토리얼 'Step1' 디렉토리에 명령 프롬프트를 실행한다.  혹은 명령 프롬프트에서 'Step1'으로 이동한다.

명령프롬프트 환경에서 Step1 디렉토리 이미지

 

'Step1' 디렉토리에 'build' 이름의 디렉토리를 생성한다. 

mkdir build

 

그 다음 생성한 'build' 디렉토리에 들어간 다음, 그 곳에서 cmake  프로젝트를 구축한다.  명령어는 아래와 같다.

 

튜토리얼 문서에서는 'cmake ../Step1' 이라고 명시되어 있지만 필자가 했을 때, 프롬프트 상에서 cmake가 작동하지 않았다. 그 대신 아래와 같은 코드로 cmake를 정상적으로 작동시킬 수 있었다. 

cd build 

cmake ..

 

정상적으로 프로젝트가 구축이 되면 아래 이미지 같은 문구가 나오고 'build' 디렉토리에 들어가보면 프로젝트가 생성된 것을 확인할 수 있다.

정상적으로 Generate 된 이미지
생성된 프로젝트 파일

 

프로젝트가 정상적으로 구축되었으면 다음은Cmake으로 해당 프로젝트의 소스코드를 컴파일 해보자. 

 

여기서 주의할 점은 build 커맨드 뒤에 마침표가 하나 있는데 이것을 반드시 포함시켜야 한다. 

안넣으면 빌드가 되지 않는다. (필자도 마침표 있는 줄 모르고 계속 빌드하면서 애먹었다. ;;)

cmake --build .

 

정상적으로 빌드되면 아래 이미지 처럼 빌드 파일이 생성된다.

Debug 디렉토리가 빌드파일이다.

 

튜토리얼 문서가 명시한대로 컴파일된 프로그램을 실행시켜보자.  실행 명령어는 다음과 같다. 

# 해당 명령어를 입력했는데도 실행이 안되면 ./Tutorial 또는 .\Tutorial 으로 실행시켜 보자.
Tutorial 4294967296
Tutorial 10
Tutorial

 

 


연습 2. C++ 표준 지정하기

CMake에는 프로젝트 코드에 의해 설정될 때 CMake에 의미가 있거나 배후에서 생성되는 특별한 변수가 있다. 이러한 변수 중 많은 것이 CMAKE_로 시작한다. 

 

특히 프로젝트  변수를 만들 때 CMAKE으로 시작되는 단어는 피하도록 한다. 

 

 이러한 특수 사용자 설정 변수 중 두 가지는 CMAKE_CXX_STANDARD와 CMAKE_CXX_STANDARD_REQUIRED이다. 이 두 변수는 프로젝트를 빌드하는 데 필요한 C++ 표준을 지정하는 데 함께 사용될 수 있다.

 

연습 2.1. Tutorial.cxx 파일에 C++ 11 표준 코드로 수정 

  // convert input to double
  // TODO 4: Replace atof(argv[1]) with std::stod(argv[1])
  const double inputValue = std::stod(argv[1]);

연습 2.2. CMakeLists.txt의 TODO 6 코드 추가 

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

연습 2.3. 프로젝트 빌드 

cd Step1_build
cmake --build 
# 만약 위의 코드를 입력해도 빌드가 되지 않는다면 build 디렉토리의 파일들을 모두 제거 후
# 다시 프로젝트를 만들고 빌드를 진행한다.

# 빌드 완료 후, 연습 1 처럼 Debug 디렉토리의 Tutorial 실행파일을 열어준다. 
Tutorial 4294967296
Tutorial 10
Tutorial

연습 3. 버전 번호 및 구성된 헤더 파일 추가하기

"때때로 CMakelists.txt 파일에 정의된 변수를 소스 코드에서도 사용할 수 있게 하는 것이 유용할 수 있다.이 경우 프로젝트 버전을 출력하고자 한다.

 

이를 달성하는 한 가지 방법은 구성된 헤더 파일을 사용하는 것이다. 하나 이상의 변수를 대체할 입력 파일을 만들고 이러한 변수들은 @VAR@와 같은 특수한 구문을 갖는다.

 

그런 다음, configure_file() 명령을 사용하여 입력 파일을 지정된 출력 파일에 복사하고, CMakelists.txt 파일에서 VAR의 현재 값으로 이 변수들을 대체한다. 

 

버전을 직접 소스 코드에서 편집할 수도 있지만, 이 기능을 사용하는 것이 더 선호된다. 이는 단일 진실의 소스코를을 만들고 중복을 피할 수 있기 때문이다.

 

연습 3.1. CMakeLists.txt의 버전 정보 기입 

프로젝트 커맨드 인수 뒤에 버전 정보를 추가 한다. 

project(Tutorial VERSION 1.16)

 

연습 3.2. CMakeLists.txt의 Configure_file 생성

# 첫번째 인수 : 현재 디렉토리에 존재하는 Config 입력 파일 명
# 두번째 인수 : 출력 Config 파일 명
configure_file(TutorialConfig.h.in TutorialConfig.h)

 

연습 3.3. TutorialConfig.h.in  내 변수 설정 

# TutorialConfig.h.in 
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

연습 3.4. TutorialConfig.h 포함 디렉토리 설정 

# Tutorial.cxx 소스코드에 #include 하겠다는 뜻
target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}")

 

연습 3.5. Tutorial.cxx에 TutorialConfig.h 포함 및 버전 정보 기입 

// A simple program that computes the square root of a number
#include <cmath>
#include <iostream>
#include <string>

#include "TutorialConfig.h"
int main(int argc, char* argv[])
{
  if (argc < 2) {
  		// 버전 정보 출력 
      std::cout << argv[0] << "Version: " << Tutorial_VERSION_MAJOR << "."
          << Tutorial_VERSION_MINOR << std::endl;
    std::cout << "Usage: " << argv[0] << " number" << std::endl;
    return 1;
  }
}

프로젝트 생성 및 빌드 

연습 1, 연습 2의 방식과 동일하므로 생략

명령 프롬프트 상 출력 결과  

Tutorial.exe Version: 1.16

 

여기서 알 수 있는 점은 CMakeLists.txt에서 Project Version을 기입했을 때

 

- @Tutorial_VERSION_MAJOR@ ==> 1

- @Tutorial_VERSION_MINOR@ ==> 16

 

형태로 변수가 저장된다는 점이다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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 31
글 보관함