Post

Cmake 라이브러리 상호 의존

폴더 구조

project_root/
├── CMakeLists.txt
└── src/
    ├── libA/  # libA 가 libB 를 include 함
    │   ├── libA.cpp
    │   ├── libA.h
    │   └── CMakeLists.txt
    └── libB/
        ├── libB.cpp
        ├── libB.h
        └── CMakeLists.txt

각 디렉토리별 CMake 설정

  • src/libB/CMakeLists.txt
    1
    2
    
    add_library(libB STATIC libB.cpp)
    target_include_directories(libB PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    

    → PUBLIC으로 설정하면, libB를 사용하는 다른 라이브러리도 libB.h를 include할 수 있습니다.

  • src/libA/CMakeLists.txt
    1
    2
    3
    
    add_library(libA STATIC libA.cpp)
    target_include_directories(libA PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    target_link_libraries(libA PUBLIC libB)  # libA가 libB에 의존
    

    → target_link_libraries(libA PUBLIC libB)를 사용하면: libA.cpp가 #include “libB.h” 가능 libA를 사용하는 다른 라이브러리/실행파일도 libB를 자동으로 링크함

  • root CMakeLists.txt
1
2
3
4
5
6
7
8
9
cmake_minimum_required(VERSION 3.16)
project(MultiLibExample)

add_subdirectory(src/libB)
add_subdirectory(src/libA)

# 실행 파일 만들고 libA, libB 연결
add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE libA)

→ libA만 링크하면, libB는 자동으로 링크됨 (PUBLIC 덕분)

  • 코드 예시: libA.cpp
1
2
3
4
5
6
#include "libA.h"
#include "libB.h"  // OK: CMake가 include path 설정함

void funcA() {
    funcB(); //test
}
This post is licensed under CC BY 4.0 by the author.