CMake не может найти libboost

Вопрос или проблема

Похоже, что есть МНОГО вопросов о том, что 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 все же выдает ошибку.

Причины возможной ошибки

  1. Неправильная версия Boost в CMakeLists.txt: Как вы сами заметили, у вас в строке FIND_PACKAGE(Boost 1.66 COMPONENTS program_options regex filesystem REQUIRED) указана версия 1.66, в то время как вам нужна 1.73. Это может привести к тому, что CMake будет искать компоненты в версии, которая не соответствует установленной, даже если список версий дополнительного поиска включает 1.73.

  2. Переменные окружения и пути поиска: Возможно, CMake не может найти нужные библиотеки, потому что пути, по которым он ищет, не совпадают с местом установки. В вашем выводе видно, что BOOST_ROOT, BOOST_INCLUDEDIR и BOOST_LIBRARYDIR не установлены, что также может вызвать проблемы. Нужно убедиться, что указанные пути действительно содержат нужные файлы (например, libboost_program_options.so, libboost_regex.so, libboost_filesystem.so и др.).

  3. Настройки многопоточности и статических библиотек: В вашем CMakeLists.txt указаны настройки многопоточности и статического связывания. Убедитесь, что вы установили Boost с этими параметрами (например, libboost-program-options-dev, libboost-regex-dev, libboost-filesystem-dev и т.д.).

Рекомендации по решению проблемы

  1. Исправьте строку FIND_PACKAGE: Замените вашу строку на следующую:

    FIND_PACKAGE(Boost 1.73 COMPONENTS program_options regex filesystem REQUIRED)
  2. Убедитесь, что библиотеки установлены: Проверьте, что установлены необходимые библиотеки. Для этого можно использовать следующую команду:

    dpkg -l | grep libboost

    Убедитесь, что пакеты libboost-program-options-dev, libboost-regex-dev, libboost-filesystem-dev присутствуют.

  3. Указание путей: При необходимости можно явно указать пути к библиотекам и заголовочным файлам в вашем CMakeLists.txt:

    set(BOOST_ROOT "/usr/lib/x86_64-linux-gnu")
    set(BOOST_INCLUDEDIR "/usr/include")
  4. Кеширование CMake: После внесения изменений в CMakeLists.txt или в системные переменные, не забудьте удалить кэш CMake, чтобы избежать конфликтов:

    rm -rf CMakeFiles CMakeCache.txt
  5. Запуск CMake: Запустите CMake заново и посмотрите на результаты. Используйте:

    cmake .

Следуя этим рекомендациям, вы сможете устранить проблему с CMake и Boost. Удачи в проекте!

Оцените материал
Добавить комментарий

Капча загружается...