본문 바로가기
프로그래밍 언어/Cmake

CMake EXPORT

by 규봉봉이 2025. 4. 25.

cmake의 export는 패키지를 할 때, 다른 cmake 프로젝트에서 손쉽게 패키지화 된 라이브러리를 사용하기 위함이다.

cmake export를 사용해보자

 

준비

아래와 같이 프로젝트를 구성해보았다.

mylib/
├── CMakeLists.txt
├── library.h
├── library.cpp
└── MyLibConfig.cmake.in

 

mylib/CmakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(MyLib VERSION 1.0.0)

add_library(mylib SHARED library.cpp)

target_include_directories(mylib
        PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
        $<INSTALL_INTERFACE:include>
)

# 설치 설정, install의 대상은 CMake 타겟
install(TARGETS mylib
        EXPORT MyLibTargets      # 타겟 정보를 따로 export할 것도 명시
        LIBRARY DESTINATION lib  # 공유 라이브러리 (.so, .dylib) 파일은 lib 디렉토리로
        ARCHIVE DESTINATION lib  # 정적 라이브러리 (.a) 파일도 lib 디렉토리로
        INCLUDES DESTINATION include # 타겟의 include 경로는 나중에 include 폴더를 기준으로 한다
) # "mylib" 타겟 자체를 설치, 빌드 결과물 (.so, .a)을 설치

# 헤더 파일 설치, 단순한 파일이 install 대상
install(FILES library.h DESTINATION include)

# 타겟의 메타정보(구성 정보)를 cmake용 스크립트로 저장
# 타겟을 다른 프로젝트가 find_package(MyLib)로 쉽게 찾게하기 위해
install(EXPORT MyLibTargets
    FILE MyLibTargets.cmake
    NAMESPACE MyLib::       # 설치할 때 타겟 이름에 붙일 namespace (ex: MyLib::mylib)
    DESTINATION share/MyLib/cmake
)

# Config.cmake 파일 생성
include(CMakePackageConfigHelpers)

configure_package_config_file(
        ${CMAKE_CURRENT_SOURCE_DIR}/MyLibConfig.cmake.in
        ${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake
        INSTALL_DESTINATION share/MyLib/cmake
)

install(FILES
        ${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake
        DESTINATION share/MyLib/cmake
)

$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>와 $<INSTALL_INTERFACE:include> CMake의 generator expressions으로 target_include_directories()에서 빌드할 때는 BUILD_INTERFACE의 정의를 사용하고 cmake --build 중에는 INSTALL_INTERFACE를 사용한다는 의미

이렇게 빌드할 때와 설치 할때의 상황을 분리하기 위한 의도이다.

 

자주 사용하는 generator expressions

$<CONFIG:Debug> Debug 구성(build type)일 때 true
$<BOOL:...> 값이 참이면 1, 거짓이면 0 반환
$<BUILD_INTERFACE:...> 빌드할 때만 적용
$<INSTALL_INTERFACE:...> 설치 후 사용할 때만 적용
$<TARGET_PROPERTY:tgt,prop> 타겟(tgt)의 속성(prop)을 읽음
$<AND:cond1,cond2,...> 여러 조건을 모두 만족하는 경우 true
$<OR:cond1,cond2,...> 여러 조건 중 하나라도 만족하면 true
$<NOT:cond> 조건 반전

 

MyLibConfig.cmake.in

@PACKAGE_INIT@

include("${CMAKE_CURRENT_LIST_DIR}/MyLibTargets.cmake")

 

빌드 & install

아래 스크립트를 실행하면 패키지화된 결과가 나온다.

mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=../install
cmake --build .
cmake --install .

 

cmake --install 커맨드를 수행하면 아래와 같이 결과물이 설치된다.

.
├── include
│   └── library.h
├── lib
│   └── libmylib.so
└── share
    └── MyLib
        └── cmake
            ├── MyLibConfig.cmake
            ├── MyLibTargets.cmake
            └── MyLibTargets-noconfig.cmake

 

 

├── CMakeLists.txt
└── main.cpp

위와 같이 다른 외부 프로젝트를 생성하고 CmakeLists.txt에 아래와 같이 패키지화된 MyLib를 사용할 수 있다.

 

cmake_minimum_required(VERSION 3.31)
project(other)

set(CMAKE_CXX_STANDARD 17)

find_package(MyLib REQUIRED PATHS /home/bont/Desktop/log)

add_executable(other main.cpp)
target_link_libraries(other PRIVATE MyLib::mylib)

 

'프로그래밍 언어 > Cmake' 카테고리의 다른 글

RUNPATH를 통해 다른 환경에서 LD_LIBRARY_PATH 무시하고 실행  (0) 2025.04.25
Conan 패키지 매니저: 시작하기  (0) 2023.09.21
cmake  (0) 2023.04.05
Makefile  (0) 2020.05.25
GCC  (0) 2020.05.12