使用cmake安装目标依赖项

问题描述 投票:0回答:1

我有一个应该安装静态库及其所有依赖项的项目。这些依赖项之一是boost

我有类似以下内容,但不起作用:

cmake_minimum_required(VERSION 3.9.0)

project(install_test)

find_package(Boost REQUIRED COMPONENTS system)

set(Boost_USE_STATIC_LIBS TRUE)

add_executable(test src/main.cpp)

target_link_libraries(test Boost::boost)

add_dependencies(test Boost::boost)

install(TARGETS test DESTINATION ${CMAKE_INSTALL_LIBDIR})

install(TARGETS Boost::boost DESTINATION ${CMAKE_INSTALL_LIBDIR})

注意:boost可以找到,如果我删除最新的install语句,一切正常。

该怎么做?

boost cmake
1个回答
0
投票

由于安装可能在同一台机器上进行(将编译您的库),并且已经安装了Boost库(因为可以找到它),因此应通过Config导出库及其依赖项。 cmake文件。所有的依赖关系都可以通过find_dependency找到(我不认为您要复制所有的boost库)。它将在与已安装的库链接时搜索所需的软件包。

$ {PROJECT_NAME} Config.cmake.in文件

@PACKAGE_INIT@

include(CMakeFindDependencyMacro)

find_dependency(glad REQUIRED)
find_dependency(glm REQUIRED)

include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")

check_required_components(gl_traits)

CMakeLists.txt

#... define here sources and public headers

add_library(${PROJECT_NAME}
    STATIC
        ${PUBLIC_HEADERS}

        ${SOURCES}
    )

set_target_properties(${PROJECT_NAME}
    PROPERTIES

        OUTPUT_NAME ${PROJECT_NAME}
        DEBUG_POSTFIX "_d"

    )

target_link_libraries(${PROJECT_NAME}
    PUBLIC
        Boost::boost
    )

target_include_directories(${PROJECT_NAME}
    PUBLIC
        $<INSTALL_INTERFACE:${INSTALL_INCLUDEDIR}/${PROJECT_NAME}>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/${PROJECT_NAME}>

    PRIVATE
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
    )

set(targets_export_name ${PROJECT_NAME}Targets)
set(project_config ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake)
set(version_config ${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake)

include(CMakePackageConfigHelpers)

write_basic_package_version_file(
        ${version_config}
    VERSION
        ${PROJECT_VERSION}
    COMPATIBILITY SameMajorVersion
    )

configure_package_config_file(
        ${PROJECT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in
        ${project_config}
    INSTALL_DESTINATION
        ${INSTALL_CMAKEDIR}
    )

install(TARGETS
        ${PROJECT_NAME}
    EXPORT
        ${targets_export_name}
    ARCHIVE
        DESTINATION ${INSTALL_LIBDIR}
        COMPONENT lib
    LIBRARY
        DESTINATION ${INSTALL_LIBDIR}
        COMPONENT lib
    RUNTIME
        DESTINATION ${INSTALL_BINDIR}
        COMPONENT bin
    )

install(EXPORT
        ${targets_export_name}
    DESTINATION
        ${INSTALL_CMAKEDIR}
    )

install(FILES ${PUBLIC_HEADERS} DESTINATION ${INSTALL_INCLUDEDIR}/${PROJECT_NAME} COMPONENT dev)
install(FILES 
        ${project_config}
        ${version_config}
    DESTINATION
        ${INSTALL_CMAKEDIR}
    )

如果需要安装目标文件,请使用$<TARGET_FILE:target_name>

© www.soinside.com 2019 - 2024. All rights reserved.