在CMake中使用静态库应用target_link_libraries的正确方法是什么

时间:2017-01-27 17:51:51

标签: c++ cmake

我正在构建一个链接到静态库的库。我正在尝试找出一种方法来传播包含而不是传播静态库的库,当我导出我正在构建的库的目标时。下面是静态库的示例CMakeLists

cmake_minimum_required(VERSION 3.7)
project(mystaticlib)

set(PROJECT_SRCS ${PROJECT_SOURCE_DIR}/src/mystatic.cpp)
set(PROJECT_INCS ${PROJECT_SOURCE_DIR}/include/mystatic.h)

add_library(${PROJECT_NAME} STATIC ${PROJECT_SRCS} ${PROJECT_INCS})

target_include_directories(${PROJECT_NAME} PUBLIC
        $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include>)

export(TARGETS ${PROJECT_NAME}
      APPEND FILE ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}Targets.cmake)

非常标准,没什么特别的,现在这里是我链接到这个静态库的库的CMakeLists

cmake_minimum_required(VERSION 3.7)
project(testlib)

set(PROJECT_SRCS ${PROJECT_SOURCE_DIR}/src/mytest.cpp)
set(PROJECT_INCS ${PROJECT_SOURCE_DIR}/include/mytest.h)

add_library(${PROJECT_NAME} SHARED ${PROJECT_SRCS} ${PROJECT_INCS})

target_include_directories(${PROJECT_NAME} PUBLIC
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include>)

target_link_libraries(${PROJECT_NAME} PRIVATE mystaticlib)

# target_link_libraries(${PROJECT_NAME} PUBLIC mystaticlib)

export(TARGETS ${PROJECT_NAME}
      APPEND FILE ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}Targets.cmake)

target_link_libraries PRIVATE的问题是静态库中的include目录无法导出。因此,外部用户链接到testlib,它无法找到静态库标题的位置。

target_link_libraries PUBLIC的问题是将静态库暴露给外部用户,这是不希望的。我只希望外部用户能够链接到testlib

解决这个问题的正确方法是什么?

0 个答案:

没有答案