#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
andoptimized
в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