티스토리 뷰

개요

이 장에서 알 수 있는 것

  • 라이브러리에 대한 사용 요구 사항 추가
  • 필요한 C++ 표준을 지정하기 위해 INTERFACE 라이브러리 타겟을 추가

사용한 CMake 커맨드


타깃 포함 디렉토리 속성에 대한 이해 

해당 챕터를 공부하면서 이해하느라 가장 오랜시간을 소비한 부분 같다. 

target_include_directories() 커맨드 앞 절에도 사용했었지만 3가지 속성을 선택할 수 있다.

  • PRIVATE
    • 지정된 포함 디렉토리가 타겟 자체 내에서만 사용
    • 다른 타겟이 이 타겟에 링크할 때는 이 포함 디렉토리가 전파되지 않음
    • 타겟 내부 구현에만 영향을 미침
  • INTERFACE
    • 지정된 포함 디렉토리가 타겟을 소비하는 타겟에서만 사용
    • 타겟 자체에는 적용되지 않으며, 주로 헤더 전용 라이브러리에 사용됨
    • 타겟 자체는 필요 없고, 이를 링크하는 타겟들이 필요로 하는 경우에 사용
  • PUBLIC
    • 지정된 포함 디렉토리가 타겟 자체와 이를 링크하는 다른 타겟 모두에서 사용
    • 타겟 내부 구현과 이를 링크하는 타겟 모두에 영향을 미침

여기서 INTERFACE 속성이 가장 이해가 되지 않았었는데, 결국 기능은 PUBLIC 속성과 같은데 INTERFACE를 사용하는 이류가 있을까 라는 의문이었다. 

 

최적화 측면에 본다면 INTERFACE를 사용하는 목적이 비로소 보이는데, 실행 프로그램에서 라이브러리를 포함하고 포함된 라이브러리의 함수를 불러온다. 여기서 한번 더 생각해 본다면 

라이브러리가 라이브러리 자신을 포함할 필요가 있을까? 

 

그렇다. INTERFACE 속성은  타겟이 해당 라이브러를 링크할 때 비로소 포함되는 역할을 한다. 

 


연습 1. 라이브러리 사용 요구사항 추가 

연습 1.1. 라이브러리 포함 디렉토리 설정 

Step2 에서 연습했던 MathFunctions 의 CMakeLists.txt 를 리펙토링 해보자. 

 

이전에는 MathFunctions 라이브러리를 추가만 하고 포함하는 작업은 상위의 CMakeLists.txt에서 정의 했었다. 

 

이번에는 MathFunctions가 필요한 포함 디렉토리를 자체적으로 지정하도록 만들어 볼 것이다. 

add_library(MathFunctions MathFunctions.cxx)

target_include_directories(MathFunctions INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

 

연습 1.2. 상위 CMakeLists.txt 에 MathFunctions 포함 제거하기

Step3의 CmakeLists.txt 예제를 보면 MathFunctions를 포함시킨 커맨드들이 구현되어 있다. 

 

이것들을 모두 지워주자. 

# add the MathFunctions library
add_subdirectory(MathFunctions)

# add the executable
add_executable(Tutorial tutorial.cxx)

target_link_libraries(Tutorial PUBLIC MathFunctions)

target_include_directories(Tutorial PUBLIC
                           "${PROJECT_BINARY_DIR}"
                          )

 

연습 1 결과

수정 후, 프로젝트를 생성하고 Tutorial 솔루션의 MathFunctions 프로젝트 속성을 열어보면 추가 포함 디렉터리에 MathFunctions 디렉터리가 포함된 것을 확인할 수 있다.

생성된 Tutorial 프로젝트의 MathFunctions 라이브러리 속성

 


연습 2.  필요한 C++ 표준을 지정위한 INTERFACE 라이브러리 타겟 추가하기

연습 2.1. 인터페이스 라이브러리 생성 및 C++ 표준 정의하기 

Step3의 CMakeLists.txt 파일에 해당 커맨드를 입력해주자.

add_library(tutorial_compiler_flags INTERFACE)

target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)

 

연습 2.2. 기존에 설정되어있는 C++ 표준 설정 삭제하기

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

 

연습 2.3. 정의한 인터페이스 라이브러리를 타겟에 링크하기

target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags)

 

연습 2.4. 라이브러리 타겟에 인터페이스 라이브러리 링크 시키기

MathFunctions 와 SqrtLibray에 인터페이스 라이브러리를 링크 시키면 어떻게 될까? 
현재 인터페이스 라이브러리는 C++ 표준 11으로 컴파일 되도록 정의되어 있다. 

즉 MathFunctions 와 SqrtLibray 또한 C++ 표준 11 으로 컴파일 된다.

if (USE_MYMATH)
  target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")

  # library that just does sqrt
  add_library(SqrtLibrary STATIC
              mysqrt.cxx
              )
  target_link_libraries(MathFunctions PRIVATE SqrtLibrary )


 target_link_libraries(SqrtLibrary PUBLIC tutorial_compiler_flags )
endif()

target_link_libraries(MathFunctions PUBLIC tutorial_compiler_flags)

 

연습 2 결과 

결국 상위 CMakeList 에서 인터페이스 라이브러리를 생성하여 C++ 표준 컴파일러를 저장하고 이를 외부 라이브러리에 링크 시킴으로써 통일된 C++ 표준으로 컴파일 되도록 할 수 있다. 

 


 

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함