target_link_directories(), target_link_libraries()

타겟을 링킹할 때 링커가 라이브러리를 검색할 경로를 지정한다. 즉, 외부라이브러리의 lib 파일 디렉토리를 지정할 때 사용된다. 각 항목은 절대 경로 또는 상대 경로일 수 있으며, 후자는 현재 소스 디렉토리에 대한 상대 경로로 해석된다.

 

주의할 점은 `target_link_directories()`만 단독으로 쓰는 것은 권장되지 않는 것 같다. 단독으로 사용하게 되면 링커가 타겟에 필요한 라이브러리를 알아서 찾도록 동작하기에 링크할 대상 파일이 무엇인지 명확하지 않다. 그래서 `target_link_libraries()`와 같이 사용하게 된다.

 

예시

target_link_directories(${PROJECT_NAME} PUBLIC ${DEP_LIB_DIR}) # lib 파일 존재하는 디렉토리 지정
target_link_libraries(${PROJECT_NAME} PUBLIC ${DEP_LIBS}) # 실제로 어떤 라이브러리를 사용할지를 지정

 

 

다른 방법

방법 1. target_link_libraries() 단독 사용

그런데, `target_link_libraries()` 커맨드는 전체 경로를 포함해서 동작할 수 있기에, ` target_link_directories()` 커맨드를 사용하지 않고 ` target_link_libraries()` 커맨드 단독으로 전체 경로를 포함하여 사용하는 방법도 있다.

 

방법 2. IMPORTED 타겟 활용 (모던 CMake 방식)

IMPORTED 타겟을 통해 프로젝트 외부에 있는 파일을 프로젝트 내부의 논리적인 타겟으로 변환할 수 있다. 이 방식은 외부 라이브러리를 `target_link_libraries()`에서 직접 경로를 넘기지 않고 타겟 이름으로 참조를 할 수 있게 해준다, 

add_library(spdlog::spdlog STATIC IMPORTED GLOBAL)

set_target_properties(spdlog::spdlog PROPERTIES
    IMPORTED_LOCATION "${DEP_LIB_DIR}/spdlog$<$<CONFIG:Debug>:d>.lib"
    INTERFACE_INCLUDE_DIRECTORIES "${DEP_INCLUDE_DIR}"
)

target_link_libraries(${PROJECT_NAME}
    PRIVATE
        spdlog::spdlog
)

 

 

 

 

참고 자료