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?

3

Решение

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

Я должен установить значение этой переменной вручную, поставив следующее
до моего 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()

# now we should be able to find boost correctly.
find_package(Boost REQUIRED COMPONENTS system context coroutine thread random REQUIRED)

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

3

Другие решения

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

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

set (Boost_ARCHITECTURE "-x64")

Источник: https://github.com/Kitware/CMake/commit/1e08b625c291e0bb57d253b6656e812dc8848bd8#diff-555801259d7df67368f7deab1f9deacd

2