Вопрос или проблема
Похоже, что есть МНОГО вопросов о том, что CMake не может найти Boost. Однако ни одно из решений не сработало для меня. Так что, возможно, я смогу описать свои детали и посмотреть, сможет ли кто-то заметить проблему?
Я на Ubuntu 18.04 в виртуальной машине Parallels. Я установил Boost 1.73, используя:
sudo add-apt-repository ppa:mhier/libboost-latest
sudo apt update
sudo apt install libboost1.73-dev
Так как я хотел 1.73 (а не стандартный пакет с libboost-dev-all Ubuntu).
У меня также установлен CMake 3.18.1, используя:
sudo snap install --classic cmake
Мой CMakeLists.txt:
cmake_minimum_required(VERSION 3.17)
project(myproj LANGUAGES CXX)
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(Boost_DEBUG 1)
set(Boost_USE_MULTITHREADED ON)
set(Boost_ADDITIONAL_VERSIONS 1.66.0 1.66 1.73)
SET(Boost_USE_STATIC_LIBS NO)
# ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK)
FIND_PACKAGE(Boost 1.66 COMPONENTS program_options regex filesystem REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
add_executable(myproj src/main.cpp src/file0.cpp src/file1.cpp)
target_include_directories(myproj PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/)
set_target_properties(myproj PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "CXX")
TARGET_LINK_LIBRARIES(myproj Boost::program_options Boost::regex Boost::filesystem)
install(TARGETS ${PROJECT} DESTINATION bin)
Вот вывод выполнения cmake:
> cmake .
-- Идентификация компилятора CXX: GNU 9.3.0
-- Определение информации ABI компилятора CXX
-- Определение информации ABI компилятора CXX - завершено
-- Проверка на работающий CXX компилятор: /usr/bin/c++ - пропущено
-- Определение функций компиляции CXX
-- Определение функций компиляции CXX - завершено
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1491 ] _boost_TEST_VERSIONS = "1.66.0;1.66;1.73;1.73.0;1.73;1.72.0;1.72;1.71.0;1.71;1.70.0;1.70;1.69.0;1.69;1.68.0;1.68;1.67.0;1.67;1.6
6.0;1.66"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1492 ] Boost_USE_MULTITHREADED = "ON"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1493 ] Boost_USE_STATIC_LIBS = "YES"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1494 ] Boost_USE_STATIC_RUNTIME = <не задано>
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1495 ] Boost_ADDITIONAL_VERSIONS = "1.66.0;1.66;1.73"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1496 ] Boost_NO_SYSTEM_PATHS = <не задано>
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1528 ] BOOST_ROOT = <не задано>
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1529 ] ENV{BOOST_ROOT} = "/usr/include/boost"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1530 ] BOOST_INCLUDEDIR = "/usr/include/boost"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1531 ] ENV{BOOST_INCLUDEDIR} = "/usr/include/boost"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1532 ] BOOST_LIBRARYDIR = "/usr/lib/x86_64-linux-gnu"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1533 ] ENV{BOOST_LIBRARYDIR} = "/usr/lib/x86_64-linux-gnu"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1605 ] _boost_INCLUDE_SEARCH_DIRS = "/usr/include/boost;/usr/include/boost/include;/usr/include/boost;PATHS;C:/boost/include;C:/boost;/
sw/local/include"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1606 ] _boost_PATH_SUFFIXES = "boost-1_66_0;boost_1_66_0;boost/boost-1_66_0;boost/boost_1_66_0;boost-1_66;boost_1_66;boost/boost-1_66;b
oost/boost_1_66;boost-1_73;boost_1_73;boost/boost-1_73;boost/boost_1_73;boost-1_73_0;boost_1_73_0;boost/boost-1_73_0;boost/boost_1_73_0;boost-1_73;boost_1_73;boost/boost-1_73;boost/boost_1_73;boost
-1_72_0;boost_1_72_0;boost/boost-1_72_0;boost/boost_1_72_0;boost-1_72;boost_1_72;boost/boost-1_72;boost/boost_1_72;boost-1_71_0;boost_1_71_0;boost/boost-1_71_0;boost/boost_1_71_0;boost-1_71;boost_1
_71;boost/boost-1_71;boost/boost_1_71;boost-1_70_0;boost_1_70_0;boost/boost-1_70_0;boost/boost_1_70_0;boost-1_70;boost_1_70;boost/boost-1_70;boost/boost_1_70;boost-1_69_0;boost_1_69_0;boost/boost-1_69_0;boost/boost_1_69_0;boost-1_69;boost_1_69;boost/boost-1_69;boost/boost_1_69;boost-1_68_0;boost_1_68_0;boost/boost-1_68_0;boost/boost_1_68_0;boost-1_68;boost_1_68;boost/boost-1_68;boost/boost_1_68;boost-1_67_0;boost_1_67_0;boost/boost-1_67_0;boost/boost_1_67_0;boost-1_67;boost_1_67;boost/boost-1_67;boost/boost_1_67;boost-1_66_0;boost_1_66_0;boost/boost-1_66_0;boost/boost_1_66_0;boost-1_66;boost_1_66;boost/boost-1_66;boost/boost_1_66"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1621 ] местоположение version.hpp: /usr/include/boost/version.hpp
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1661 ] Boost_VERSION = "1.73.0"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1662 ] Boost_VERSION_STRING = "1.73.0"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1663 ] Boost_VERSION_MACRO = "107300"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1664 ] Boost_VERSION_MAJOR = "1"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1665 ] Boost_VERSION_MINOR = "73"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1666 ] Boost_VERSION_PATCH = "0"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1667 ] Boost_VERSION_COUNT = "3"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1691 ] Boost_LIB_PREFIX = ""
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1692 ] Boost_NAMESPACE = "boost"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:801 ] _boost_COMPILER = "-gcc9" (предполагается)
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1728 ] _boost_MULTITHREADED = "-mt"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1805 ] _boost_ARCHITECTURE_TAG = "" (обнаружен)
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1809 ] _boost_RELEASE_ABI_TAG = "-"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1810 ] _boost_DEBUG_ABI_TAG = "-d"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1870 ] _boost_LIBRARY_SEARCH_DIRS_RELEASE = "/usr/lib/x86_64-linux-gnu;/usr/include/boost/lib;/usr/include/boost/stage/lib;/usr/include/lib;/usr/include/../lib;/usr/include/stage/lib;PATHS;C:/boost/lib;C:/boost;/sw/local/lib"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:1871 ] _boost_LIBRARY_SEARCH_DIRS_DEBUG = "/usr/lib/x86_64-linux-gnu;/usr/include/boost/lib;/usr/include/boost/stage/lib;/usr/include/lib;/usr/include/../lib;/usr/include/stage/lib;PATHS;C:/boost/lib;C:/boost;/sw/local/lib"
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:2056 ] Поиск PROGRAM_OPTIONS_LIBRARY_RELEASE: boost_program_options-gcc9-mt-1_73;boost_program_options-gcc9-mt;boost_program_op
tions-gcc9-mt;boost_program_options-mt-1_73;boost_program_options-mt;boost_program_options-mt;boost_program_options-mt;boost_program_options
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:2111 ] Поиск PROGRAM_OPTIONS_LIBRARY_DEBUG: boost_program_options-gcc9-mt-d-1_73;boost_program_options-gcc9-mt-d;boost_program_
options-gcc9-mt-d;boost_program_options-mt-d-1_73;boost_program_options-mt-d;boost_program_options-mt-d;boost_program_options-mt;boost_program_options
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:2056 ] Поиск REGEX_LIBRARY_RELEASE: boost_regex-gcc9-mt-1_73;boost_regex-gcc9-mt;boost_regex-gcc9-mt;boost_regex-mt-1_73;boost_
regex-mt;boost_regex-mt;boost_regex-mt;boost_regex
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:2111 ] Поиск REGEX_LIBRARY_DEBUG: boost_regex-gcc9-mt-d-1_73;boost_regex-gcc9-mt-d;boost_regex-gcc9-mt-d;boost_regex-mt-d-1_73;
boost_regex-mt-d;boost_regex-mt-d;boost_regex-mt;boost_regex
-- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:2056 ] Поиск FILESYSTEM_LIBRARY_RELEASE: boost_filesystem-gcc9-mt-1_73;boost_filesystem-gcc9-mt;boost_filesystem-gcc9-mt;boost_
filesystem-mt-1_73;boost_filesystem-mt;boost_filesystem-mt;boost_filesystem-mt;boost_filesystem -- [ /snap/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:2111 ] Поиск FILESYSTEM_LIBRARY_DEBUG: boost_filesystem-gcc9-mt-d-1_73;boost_filesystem-gcc9-mt-d;boost_filesystem-gcc9-mt-d;boost_filesystem-mt-d-1_73;boost_filesystem-mt-d;boost_filesystem-mt-d;boost_filesystem-mt;boost_filesystem CMake Ошибка в /snap/cmake/513/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:165 (сообщение):
Не удалось найти Boost (отсутствует: program_options regex filesystem) (найден подходящий вариант "1.73.0", минимально требуется "1.66")
Call Stack (самая последняя первичная):
/snap/cmake/513/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:458 (_FPHSA_FAILURE_MESSAGE)
/snap/cmake/513/share/cmake/513/share/cmake-3.18/Modules/FindBoost.cmake:2177 (find_package_handle_standard_args)
CMakeLists.txt:15 (FIND_PACKAGE)
-- Конфигурация не завершена, произошли ошибки!
Посмотрите также "/projects/myproj/model/CMakeFiles/CMakeOutput.log".
> rm^Crf CMakeFiles CMakeCache.txt
> vim CMakeLists.txt
> cmake --version
cmake version 3.18.1
CMake набор, поддерживаемый и обслуживаемый Kitware (kitware.com/cmake).
Может кто-то взглянуть и увидеть, если заметит что-то?
Теперь я чувствую себя глупо. Понял это, только что разместив этот вопрос:
FIND_PACKAGE(Boost 1.66 COMPONENTS program_options regex filesystem REQUIRED)
Все должно включать версию 1.73
Ответ или решение
Когда вы начинаете работать с CMake и библиотекой Boost, иногда может возникать проблема, связанная с тем, что CMake не может найти необходимые компоненты Boost. Рассмотрим подробнее вашу проблему на основе вашего описания и логов.
Описание проблемы
Вы находитесь на Ubuntu 18.04 в виртуальной машине Parallels и установили Boost версии 1.73, используя PPA. CMake установлен через snap
, и у вас есть CMakeLists.txt, в котором вы пытаетесь найти компоненты Boost. Однако, как видно из вывода CMake, он не смог найти следующие библиотеки: program_options
, regex
и filesystem
. Хотя указана версия Boost 1.73.0, CMake все же выдает ошибку.
Причины возможной ошибки
-
Неправильная версия Boost в CMakeLists.txt: Как вы сами заметили, у вас в строке
FIND_PACKAGE(Boost 1.66 COMPONENTS program_options regex filesystem REQUIRED)
указана версия 1.66, в то время как вам нужна 1.73. Это может привести к тому, что CMake будет искать компоненты в версии, которая не соответствует установленной, даже если список версий дополнительного поиска включает 1.73. -
Переменные окружения и пути поиска: Возможно, CMake не может найти нужные библиотеки, потому что пути, по которым он ищет, не совпадают с местом установки. В вашем выводе видно, что
BOOST_ROOT
,BOOST_INCLUDEDIR
иBOOST_LIBRARYDIR
не установлены, что также может вызвать проблемы. Нужно убедиться, что указанные пути действительно содержат нужные файлы (например,libboost_program_options.so
,libboost_regex.so
,libboost_filesystem.so
и др.). -
Настройки многопоточности и статических библиотек: В вашем CMakeLists.txt указаны настройки многопоточности и статического связывания. Убедитесь, что вы установили Boost с этими параметрами (например,
libboost-program-options-dev
,libboost-regex-dev
,libboost-filesystem-dev
и т.д.).
Рекомендации по решению проблемы
-
Исправьте строку FIND_PACKAGE: Замените вашу строку на следующую:
FIND_PACKAGE(Boost 1.73 COMPONENTS program_options regex filesystem REQUIRED)
-
Убедитесь, что библиотеки установлены: Проверьте, что установлены необходимые библиотеки. Для этого можно использовать следующую команду:
dpkg -l | grep libboost
Убедитесь, что пакеты
libboost-program-options-dev
,libboost-regex-dev
,libboost-filesystem-dev
присутствуют. -
Указание путей: При необходимости можно явно указать пути к библиотекам и заголовочным файлам в вашем CMakeLists.txt:
set(BOOST_ROOT "/usr/lib/x86_64-linux-gnu") set(BOOST_INCLUDEDIR "/usr/include")
-
Кеширование CMake: После внесения изменений в CMakeLists.txt или в системные переменные, не забудьте удалить кэш CMake, чтобы избежать конфликтов:
rm -rf CMakeFiles CMakeCache.txt
-
Запуск CMake: Запустите CMake заново и посмотрите на результаты. Используйте:
cmake .
Следуя этим рекомендациям, вы сможете устранить проблему с CMake и Boost. Удачи в проекте!