티스토리 뷰

CMake

[CMake 공부] Step 2: Adding a Library

권벡터 2025. 1. 5. 18:57

개요

이 장에서 알 수 있는 것

  • CMake에서 라이브러리 추가 하는 방법

사용한 CMake 커맨드


연습 1. 라이브러리 생성 

연습 1.1. 라이브러리 디렉토리 CMakeLists.txt 편집 

'Step2' 디렉토리의 'MathFunctions' 디렉토리에 들어가면 위 이미지와 같이 소스코드와 CMakeLists.txt 파일이 있다. 

'MathFunctions' 디렉토리의 소스 코드들

 

우리는 해당 디렉토리에 있는 소스 코드들을 라이브러리 형태로 만들 것이다. 

 

일반적인 정적 라이브러리를 빌드하는 원리를 생각해보면 헤더파일은 원형 그대로 유지대고 나머지 구현부(.cpp)는 

.lib 형태로 만들어지는 것을 알 수 있을 것이다. 

 

해당 명령(라이브러리 파일을 만들어 달라는)을  CMakeLists.txt 파일에 작성해보자. 

라이브러리에 포함하고자 하는 소스코드는  아래와 같다.

  • MathFunctions.cxx
  • mysqrt.cx
# 첫번째 인수: 생성하고자 하는 라이브러리 이름 정의
# 두번째 인수부터~: 추가할 cxx 소스코드 들 
add_library(MathFunctions MathFunctions.cxx mysqrt.cxx)

 

연습 1.2. 서브 디렉토리 추가하기

내가 만들고자하는 프로젝트의 서브 디렉토리를 정의 해보자. 

 

CMake가 프로젝트를 생성할 때, 어떤 디렉토리를 추가해야하는지 알아야 한다. 

사용해야하는 커맨드는 `add_subdirectory()` 이고

해당 커맨드는 'Step2' 디렉토리의 CMakeLists.txt 파일에 입력해준다. 

cmake_minimum_required(VERSION 3.10)

project(Tutorial VERSION 1.0)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

configure_file(TutorialConfig.h.in TutorialConfig.h)

# 1.2. 추가하고자 하는 서브 디렉토리 정의 
add_subdirectory(Mathfunctions) 

add_executable(Tutorial tutorial.cxx)

연습 1.3. 프로젝트에 라이브러리 링크하기 

프로젝트에 생성한 라이브러리를 링크하려면  `target_link_libraries` 를 사용한다. 

cmake_minimum_required(VERSION 3.10)

project(Tutorial VERSION 1.0)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

configure_file(TutorialConfig.h.in TutorialConfig.h)

# 1.2. 추가하고자 하는 서브 디렉토리 정의 
add_subdirectory(Mathfunctions) 

add_executable(Tutorial tutorial.cxx)

# 1.3. 프로젝트에 라이브러리 링크 
# 첫번째 인수: 타겟 프로젝트 이름
# 두번째 인수: 전역, 지역 여부
# 세번째 인수~: 링크 할 라이브러리 이름
target_link_libraries(Tutorial PUBLIC MathFunctions)

연습 1.4. 프로젝트에 디렉토리 포함시키기 

라이브러리 함수를 사용하려면 `MathFunctions` 디렉토리의 .hpp 헤더 파일을 포함시켜야 한다. 

 

우리가 기존 Visual Studio 프로젝트에서 속성에 들어간 후 추가 종속성 설정을 하는 것과 같다고 이해하면 되겠다.

여기서 사용할 커맨드는 'target_include_directories` 이다. 

cmake_minimum_required(VERSION 3.10)

project(Tutorial VERSION 1.0)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

configure_file(TutorialConfig.h.in TutorialConfig.h)

# 1.2. 추가하고자 하는 서브 디렉토리 정의 
add_subdirectory(Mathfunctions) 

add_executable(Tutorial tutorial.cxx)

# 1.3. 프로젝트에 라이브러리 링크 
target_link_libraries(Tutorial PUBLIC MathFunctions)

# 1.4. 프로젝트에 라이브러리 함수 포함시키기
target_include_directories(Tutorial PUBLIC
			"${PROJECT_BINARY_DIR}"
			"${PROJECT_SOURCE_DIR}/MathFunctions"
			)

 

연습 1.5. main.cxx 소스코드 수정 

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

#include "TutorialConfig.h"
// 라이브러리 함수 포함 
#include "MathFunctions.h"

int main(int argc, char* argv[])
{
  if (argc < 2) {
    // report version
    std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."
              << Tutorial_VERSION_MINOR << std::endl;
    std::cout << "Usage: " << argv[0] << " number" << std::endl;
    return 1;
  }

  // convert input to double
  const double inputValue = std::stod(argv[1]);

  // calculate square root
  // 라이브러리 함수 사용
  const double outputValue = mathfunctions::sqrt(inputValue);
  std::cout << "The square root of " << inputValue << " is " << outputValue
            << std::endl;
  return 0;
}

 

연습 1 결과

작성한 CMakeLists.txt 기반으로 프로젝트를 생성 및 빌드하면 아래 이미지와 같이 생성한 라이브러리의 함수를 가져와 정상적으로 실행된 것을 볼 수 있다. 

 


연습 2. 라이브러리 전처리기 설정하기 

우리가 외부 라이브러리를 사용할 때,  C++ 표준 버전이나, 컴파일 설정(x86, x64)에 따른 전처리기 설정이 포함되어있는 것을 볼 수 있다.

 

개발자의 의도에 맞게 프로젝트를 생성하고 싶을 때 설정요소를 만들고 싶을 때 `option()' 커맨드를 사용한다. 

 

위 예제는 `USE_MYMATH` 이라는 옵션 요소를 생성하여 프로젝트를 생성할 때 라이브러리의 특정기능을 사용 여부를 제어하는 방법을 설명한다. 

연습 2.1. USE_MYMATH 옵션 추가하기

MathFunctions 디렉토리의 `CMakeLists.txt' 파일에 들어가서 `option()` 커맨드를 입력한다. 

add_library(MathFunctions MathFunctions.cxx, mysqrt.cxx)

# USE_MYMATH 옵션 요소 추가
# 첫번째 인수: 추가하고자 하는 옵션 요소 이름 정의
# 두번째 인수: 옵션 요소 설명 
# 세번째 인수: 옵션 요소의 디폴트 변수
option(USE_MYMATH "Use tutorial provided math implementation" ON)

 

연습 2.2. 라이브러리 소스코드에 전처리기 설정하기 

위 예제에서 전처리기 설정을 할 소스코드는 MathFunctions 의 MathFunctions.cxx 이다. 

해당 소스코드를 열어서 USE_MYMATH 가 정의됐을 때, 라이브러리 함수를 사용하도록 로직을 구현하자. 

 

#include "MathFunctions.h"

// USE_MYMATH 전처리기 정의에 따른 조건문
#ifdef USE_MYMATH
#include "mysqrt.h"
#else 
#include <cmath>
#endif

namespace mathfunctions {
double sqrt(double x)
{
// USE_MYMATH가 정의됐을 때, 라이브러리 함수 사용 
#ifdef USE_MYMATH
    return detail::mysqrt(x);
#else
	return std::sqrt(x);
#endif
}
}

 

연습 2.3. USE_MYMATH 옵션이 활성화 됐을 때 라이브러리 생성 로직 작성 

CMake 옵션 커맨드에서 USE_MYMATH=ON 상태가 되었을 때 프로젝트 생성 로직을 작성한다. 

해당 조건문 로직은 `if()` 커맨드를 사용한다. 

# 기존에 포함시켰던 sqrt.cxx는 지워 주도록 하자.
add_library(MathFunctions MathFunctions.cxx)

option(USE_MYMATH "Use tutorial provided math implementation" ON)

# USE_MYMATH 옵션이 설정됐을 때 실행되는 로직 
if(USE_MYMATH)
	# MathFunction 라이브러리에 USE_MYMATH 정의
	target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH") 
	# SqrtLibrary 라이브러리 생성
	add_library(SqrtLibrary STATIC
			mysqrt.cxx
			)
	# MathFunctions 라이브러리에 SqrtLibrary 라이브러리 링크시키기
	target_link_libraries(MathFunctions PRIVATE SqrtLibrary)

endif()

 

연습 2 결과 

작성한 CMakeLists.txt 기반으로 프로젝트를 생성 및 빌드하면 USE_MYMATH 설정이 ON 이 된 상태로 프로젝트가 생성됐으므로 외부 라이브러리를 사용하도록 설정이 되어있다. 

 

MathFunctions 디렉토리의 빌드파일을 확인해보면 `MathFunctions.lib` 'SqrtLibrary.lib` 가 빌드된 것을 볼 수 있다. 

 

USE_MYMATH 옵션

 

생성된 `Tutorial.sln` 프로젝트 파일에 들어가서 `MathFunctions.cxx` 소스파일을 보면 USE_MYMATH이 정의된 것을 볼 수 있다.

MathFunctions.cxx에 USE_MYMATH이 정의 된 모습

 

그럼 이제 cmake에서 USE_MYMATH 옵션 설정을 OFF으로 변경해보자. 

그 전에 MathFunctions 디렉토리의 빌드된 파일을 모두 삭제해주자.

 

cmake 커맨드는 아래와 같다.

cmake .. -DUSE_MYMATH=OFF
cmake --build .

 

프로젝트가 재생성 되었다면 MathFunctions 디렉토리의 빌드된 파일을 다시 확인해보자. 

USE_MYMATH 설정을 OFF 후 빌드된 모습

빌드된 라이브러리가 `MathFunctions.lib` 하나만 있는 것을 볼 수 있다. 

 

그리고 `Tutorial.sln` 프로젝트의 `MathFunctions.cxx` 소스파일 확인해 보자.

 

MathFunctions.cxx에 USE_MYMATH 정의가 해제된 모습

 

USE_MYMATH 설정이 꺼져있는 것을 볼 수 있다.

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