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