Переключение конфигурации сборки с ссылки cmake на правильную версию библиотеки boost

Я использую Cmake для создания своего проекта на C ++, и я использую conan для поддержки своих библиотек boost. Мой файл conanfile.txt очень прост,

[requires]
boost/1.71.0@conan/stable

[generators]
cmake

Когда я устанавливаю Boost от Conan, я могу использовать следующие команды:

conan install ..

Or,

conan install .. -s build_type=Debug

Обе команды устанавливают библиотеки Bost в две разные папки в моем C: /. Conan foler.

В CMakeLists.txt у меня есть следующие строки, чтобы найти повышение

set(Boost_USE_STATIC_LIBS       ON) 
set(Boost_USE_DEBUG_LIBS        ON)
set(Boost_USE_RELEASE_LIBS      OFF)
set(Boost_USE_MULTITHREADED     ON)
set(Boost_USE_STATIC_RUNTIME    OFF)
find_package(Boost REQUIRED COMPONENTS program_options)

Однако, когда я настраиваю cmake,

cmake .. -DBoost_DEBUG=ON

он не находит отладочную версию библиотеки boost. Он всегда показывает, что указывает на версию выпуска. Естественно, работает следующая команда:

cmake --build . --config Release

Однако следующая команда не удалась,

cmake --build . --config Debug

поскольку он все еще пытается связать версию выпуска.

Как я могу перенастроить мои настройки cmake и conan, чтобы я мог легко переключаться между отладочной и выпускной версией? Любое предложение?

Ура, M


person Pixelord    schedule 20.08.2020    source источник
comment
Боковое примечание: я действительно рекомендую вам использовать boost/1.71.0 ссылку (conan.io/center/boost /1.73.0). Это ссылка, соответствующая рецепту сообщества в Индексе Центра Конана (github.com/conan -io / conan-center-index).   -  person jgsogo    schedule 20.08.2020


Ответы (2)


Если вы хотите использовать библиотеки с find_package(Boost), вам необходимо сгенерировать соответствующие файлы. Используйте генератор cmake_find_package (вам нужны разные папки для отладки и выпуска) или cmake_find_package_multi (и отладка, и выпуск могут находиться в одной папке). Просто добавьте их в свой conanfile.txt:

[requires]
boost/1.71.0

[generators]
cmake_find_package_multi

Теперь вы можете вызвать CMake из командной строки, но вам нужно указать, где найти сгенерированные файлы FindBoost.cmake (или BoostConfig.cmake, если вы используете генератор multi):

cmake .. -DCMAKE_MODULE_PATH=<path/to/dir/with/findcmake> [...more arguments]

Учтите, что, если вы не используете генератор cmake и вызов conan_basic_setup, вы должны быть уверены, что конфигурация, используемая для создания двоичных файлов Boost, которые вы получаете от Конана, соответствует той, которую вы используете для сборки своего проекта (в противном случае вы можете получить ошибки компоновщика).

person jgsogo    schedule 20.08.2020
comment
Итак, я добавил cmake_conan, как предложил @Alan Britel, и похоже, что когда я запускаю ›cmake .., он может найти две версии boost Debug и Release. Я использую следующий синтекс: conan_cmake_run (ТРЕБУЕТСЯ boost/1.71.0@conan/stable BASIC_SETUP BUILD, отсутствует версия CONFIGURATION_TYPES; отладка) Однако, когда я пытаюсь построить с помощью cmake --build. --config Debug или Release, показывает ошибку подкладки. Как я могу указать путь к библиотеке или версию во время команды сборки? Благодарю. - person Pixelord; 21.08.2020
comment
Итак, это cmake-скрипт: add_executable ($ {BINARY} _run $ {SOURCES}) target_include_directories ($ {BINARY} _run PRIVATE $ {CONAN_INCLUDE_DIRS_BOOST_PROGRAM_OPTIONS}) target_link_DElibraries ($ {CONUNGLIC_BINANLIC_BINANLIC_LIBRARES}) target_link_DElibraries ($ {CONUG_INUBLIC_BINANLIC} _run Я использую cmake --build. --config Debug, и мне пришлось поставить $ {CONAN_LIBS_DEBUG}. Для команды выпуска мне пришлось добавить $ {CONAN_LIBS_RELEASE}. Могу линковать и исполняемые файлы работают. Но я хочу сделать это так, чтобы мне не нужно было редактировать cmake и переключать конфигурацию LIB. - person Pixelord; 21.08.2020
comment
Вы можете использовать ключевые слова debug и optimized в target_link_libraries. Вы можете написать одну строку: target_link_libraries (${BINARY}_run debug ${CONAN_LIBS_DEBUG} optimized ${CONAN_LIBS_RELEASE}) и CMake будут использовать разные библиотеки в зависимости от типа сборки. - person jgsogo; 21.08.2020
comment
Вот что у меня есть в моем CMakeList.txt. add_executable ($ {BINARY} _run $ {SOURCES}) target_include_directories ($ {BINARY} _run PRIVATE $ {CONAN_INCLUDE_DIRS_BOOST_PROGRAM_OPTIONS}) target_link_libraries ($ {BINARY} _run_CONGANS_Default} - cm_debase_CM_Run_Lug_Design_Description) строить . --config Отладка работает. Но ›cmake --build. --config Release имеет проблему связывания. - person Pixelord; 21.08.2020

Если вы еще этого не сделали, я бы рекомендовал использовать https://github.com/conan-io/cmake-conan в некоторых областях это облегчает жизнь.

Если вы не хотите создавать свой проект без conan, нет реальной необходимости использовать find_package с conan. См. https://docs.conan.io/en/latest/integrations/build_system/cmake/cmake_generator.html. Вы можете использовать:

conan_basic_setup()

target_link_libraries(<target> ${CONAN_LIBS})

Or:

conan_basic_setup(TARGETS)

target_link_libraries(<target> CONAN_PKG::boost)

Если вы хотите использовать find_package, вам необходимо использовать генератор cmake_find_package и добавьте в свой conanfile.txt следующее:

[generators]
cmake_find_package
cmake_paths
person Alan Birtles    schedule 20.08.2020