Как find_package (Boost) работает со статическими и общими библиотеками? - PullRequest
0 голосов
/ 18 февраля 2019

В настоящее время я работаю над проектом, в котором есть несколько библиотек и несколько исполняемых файлов.Некоторые из исполняемых файлов будут связывать некоторые библиотеки статически, а другие будут связаны динамически.Мой вопрос заключается в том, как использовать статическую или динамическую ссылку на библиотеку, используя find_package.Я заметил, что boost имеет возможность установить Boost_USE_STATIC_LIBS перед вызовом find_package, но я не совсем уверен, как Boost использует это.Буст-билд одновременно разделяет / статический, а затем Boost_USE_STATIC_LIBS просто выбирает цель?Нужно ли мне строго использовать режим MODULE или можно использовать режим CONFIG, и какова будет польза / издержки от использования любого из режимов для такого типа поведения?

В моем нынешнем подходе используется режим конфигурации, поскольку всебиблиотека должна просто позвонить rn_lib(<target_name>) и все для них настроено.Я предполагаю, что логика выбора статической и общей цели сделана в файле config / find для библиотеки.

Желаемое поведение

set(<lib_name>_USE_STATIC_LIBS TRUE)
find_package(<lib_name> REQUIRED)

Текущий CMakeLists.txt для библиотек

function(rn_lib)
cmake_parse_arguments(RN_LIB
    ""
    "NAME"
    "SRCS;HEADERS"
    ${ARGN}
)

if (RN_LIB_NAME)
    set(target_name ${RN_LIB_NAME})
else()
    set(target_name ${PROJECT_NAME})
endif()

set(static_target_option ${target_name}_STATIC)
option(${static_target_option} "Force build as static library" OFF)

set(_config_file ${target_name}_config.h)
configure_file("cmake/${_config_file}.in" ${CMAKE_CURRENT_BINARY_DIR}/${_config_file})

if (${PROJECT_VERSION})
    set(project_version ${PROJECT_VERSION})
else()
    set(project_version 1.0)
endif()

if (static_target_option)
    message("Build Static ${target_name}")
    add_library(${target_name} STATIC
        ${RN_LIB_SRCS}
        ${RN_LIB_HEADERS}
    )
else()
    message("Build Shared ${target_name}")
    # This could still produce a static library
    add_library(${target_name}
        ${RN_LIB_SRCS}
        ${RN_LIB_HEADERS}
    )
endif()

# setup lib variables
set(include_install_dir include)
set(include_install_abs ${RN_INSTALL_PATH}/${include_install_dir})
set(config_install_dir lib/cmake/${target_name})

set(generated_dir ${CMAKE_CURRENT_BINARY_DIR}/generated)
set(version_config ${generated_dir}/${target_name}ConfigVersion.cmake)
set(project_config ${generated_dir}/${target_name}Config.cmake)

set(package_namespace RustyNail::)
set(target_export_name ${target_name}Targets)

install(
        FILES ${RN_LIB_HEADERS}
        DESTINATION ${include_install_dir}/${base_name}
)

target_include_directories(
        ${target_name}
        PUBLIC
            $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
            $<INSTALL_INTERFACE:${include_install_dir}>
)

write_basic_package_version_file(
        ${version_config}
        VERSION ${project_version}
        COMPATIBILITY  AnyNewerVersion
)

configure_package_config_file(
        ${RN_CMAKE_PATH}/Config.cmake.in
        ${project_config}
        INSTALL_DESTINATION ${config_install_dir}
)

install(
        TARGETS ${target_name}
        EXPORT ${target_export_name}
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib
        RUNTIME DESTINATION bin
        INCLUDES DESTINATION ${include_install_dir}
)

install(
        FILES ${project_config} ${version_config}
        DESTINATION ${config_install_dir}
)

install(
        EXPORT ${target_export_name}
        NAMESPACE ${package_namespace}
        DESTINATION ${config_install_dir}
)
endfunction()

Дерево проекта

- < root>
  - output dir
    - lib
    - bin
    - build
  - src
    - lib
      - lib1
      - lib2
    - apps
      - app1
      - app2
...