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

#c #boost #cmake #conan

#c #boost #cmake #конан

Вопрос:

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

 [requires]
boost/1.71.0@conan/stable

[generators]
cmake
  

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

 conan install ..
  

Или,

 conan install .. -s build_type=Debug
  

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

В CMakeLists.txt У меня есть следующие строки для поиска boost

 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
  

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

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

Приветствую, M

Комментарии:

1. Примечание: Я бы действительно рекомендовал вам использовать boost/1.71.0 reference ( conan.io/center/boost/1.73.0 ). Это ссылка, которая соответствует рецепту, подготовленному сообществом, в индексе Conan Center ( github.com/conan-io/conan-center-index ).

Ответ №1:

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

 [requires]
boost/1.71.0

[generators]
cmake_find_package_multi
  

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

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

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

Комментарии:

1. Итак, я добавил cmake_conan, как предложил @Alan Britel, и похоже, что когда я запускаю> cmake .., он может найти две версии boost Debug и Release. Я использую следующий syntex: conan_cmake_run (ТРЕБУЕТСЯ boost/1.71.0@conan/stable В СБОРКЕ BASIC_SETUP отсутствуют КОНФИГУРАЦИИ_TYPES «Release;Debug») Однако, когда я пытаюсь выполнить сборку с помощью cmake —build . —при настройке Debug или Release отображается ошибка выравнивания. Как я могу указать путь к библиотеке или версию во время команды сборки? Спасибо.

2. Итак, это скрипт cmake: add_executable(${BINARY}_run $ {SOURCES}) target_include_directories(${BINARY}_run PRIVATE ${CONAN_INCLUDE_DIRS_BOOST_PROGRAM_OPTIONS}) target_link_libraries(${BINARY}_run PUBLIC $ {CONAN_LIBS_DEBUG}) Когда я хочу выполнить отладку, я использую cmake —build . —настройка отладки, и мне пришлось поместить $ {CONAN_LIBS_DEBUG}. Для команды release мне пришлось добавить $ {CONAN_LIBS_RELEASE}. Я мог бы связать и исполняемые файлы работают. Тем не менее, я хочу сделать это таким образом, чтобы мне не нужно было редактировать cmake и переключать конфигурацию библиотеки.

3. Вы можете использовать ключевое слово debug and optimized в target_link_libraries . Вы можете написать эту единственную строку: target_link_libraries (${BINARY}_run debug ${CONAN_LIBS_DEBUG} optimized ${CONAN_LIBS_RELEASE}) и CMake будет использовать разные библиотеки в зависимости от типа сборки.

4. Вот что у меня есть в моем CMakeList.txt . add_executable(${BINARY}_run ${SOURCES}) target_include_directories(${BINARY}_run PRIVATE ${CONAN_INCLUDE_DIRS_BOOST_PROGRAM_OPTIONS}) target_link_libraries(${BINARY}_run debug ${CONAN_LIBS_DEBUG} optimized ${CONAN_LIBS_RELEASE}) Проблема в том, > cmake —build . —работает отладка конфигурации. Но > cmake —build . —в выпуске конфигурации возникла проблема со связыванием.

Ответ №2:

Если вы еще этого не сделали, я бы рекомендовал использовать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})
  

Или:

 conan_basic_setup(TARGETS)

target_link_libraries(<target> CONAN_PKG::boost)
  

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

 [generators]
cmake_find_package
cmake_paths