В настоящее время я работаю над проектом, в котором есть несколько библиотек и несколько исполняемых файлов.Некоторые из исполняемых файлов будут связывать некоторые библиотеки статически, а другие будут связаны динамически.Мой вопрос заключается в том, как использовать статическую или динамическую ссылку на библиотеку, используя 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