Cmake FindBoost.cmake MinGW-W64: поиск библиотеки с неверным именем

Я собрал Boost 1.68 (используя инструкции из https://gist.github.com/sim642/29caef3cc8afaa273ce6 и добавив link=static,shared в командной строке b2 для создания общих библиотек.)

Библиотеки, кажется, собираются правильно, и я установил BOOST_INCLUDEDIR а также BOOST_LIBRARYDIR переменные среды правильно.

Однако, когда я добавляю следующее к CMakeLists.txt:

find_package(Boost REQUIRED COMPONENTS system context coroutine thread random REQUIRED)

и генерировать с MinGW MakefilesЯ получаю следующую ошибку:

CMake Error at C:/Users/pbelanger/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/182.4129.15/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:2044 (message):
  Unable to find the requested Boost libraries.

  Boost version: 1.68.0

  Boost include path: C:/boost/install/include/boost-1_68

  Could not find the following static Boost libraries:

          boost_system
          boost_context
          boost_coroutine
          boost_thread
          boost_random

  Some (but not all) of the required Boost libraries were found.  You may
  need to install these additional Boost libraries.  Alternatively, set
  BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT
  to the location of Boost.

Я разместил вывод добавления set(Boost_DEBUG ON) перед find_package строка здесь: https://pastebin.com/yRd5DPt4

Согласно выводу отладки, скрипт поиска ищет в правильном каталоге (c:\boost\install\lib), но не находит дополнительные библиотеки, поскольку у них другая схема именования. Например, system библиотека названа libboost_system-mgw81-mt-x64-1_68.dll, но скрипт поиска передает имя библиотеки boost_system-mgw81-mt-1_68 к CMake find_library, Обратите внимание, что модель адресации (-x64) не указан в последнем названии.

У меня вопрос, это проблема с Boost или скриптом findCMake? Можно ли это исправить, установив определенную переменную cmake перед скриптом findCMake?

1 ответ

Решение

Глядя на источник FindBoost.cmake строка 1478, скрипт смотрит на значение CMAKE_CXX_COMPILER_ARCHITECTURE_ID для того, чтобы построить правильный тег архитектуры. Однако в моем компиляторе (MinGW-W64 8.1 64-bit) эта строка пуста. Поэтому тег архитектуры опущен.

Я должен установить значение этой переменной вручную, поставив следующее перед моим find_package линия:

if(WIN32 AND "x${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}" STREQUAL "x")
    message(WARNING "WIN32 compiler does not specify CMAKE_CXX_COMPILER_ARCHITECTURE_ID -- filling in manually")
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
        set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID "x64")
    else()
        set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID "x86")
    endif()
    message(STATUS "Compiler architecture: ${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}")
endif()
find_package(Boost REQUIRED COMPONENTS system context coroutine thread random REQUIRED)

Это заставляет find_package работать правильно.

После нескольких часов исследований ответ Пола Белангера спас мой день.

Покопавшись немного в кодовой базе, они добавили новую опцию для управления именно этим делом, поэтому с последней версией CMAKE вы можете добавить следующую опцию:

set (Boost_ARCHITECTURE "-x64")

Источник: https://github.com/Kitware/CMake/commit/1e08b625c291e0bb57d253b6656e812dc8848bd8

Другие вопросы по тегам