Компиляция C++ с Boost 1.68.0 в Windows с использованием CMake и MinGW

Я хочу использовать библиотеку Boost на Windows, но это было хлопотно. Я загрузил пакет Windows из здесь и распаковал его в C:\Boost:

Компиляция C++ с Boost 1.68.0 в Windows с использованием CMake и MinGW

Я добавил в свой файл CMake следующее:

find_package(Boost 1.68 REQUIRED COMPONENTS filesystem)
# ...
target_link_libraries(MyExecutable ${Boost_LIBRARIES})

Я получаю следующую ошибку CMake:

C:\Users\User\AppData\Local\JetBrains\Toolbox\apps\CLion\ch-0\183.4284.104\bin\cmake\win\bin\cmake.exe -DCMAKE_BUILD_TYPE=Debug "-DCMAKE_MAKE_PROGRAM=C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/mingw32-make.exe" "-DCMAKE_C_COMPILER=C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/x86_64-w64-mingw32-gcc.exe" "-DCMAKE_CXX_COMPILER=C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/x86_64-w64-mingw32-g++.exe" -G "CodeBlocks - MinGW Makefiles" D:\Cpp\MyProject
CMake Error at C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:2048 (message):
  Unable to find the requested Boost libraries.

  Boost version: 1.68.0

  Boost include path: C:/Boost

  Could not find the following Boost libraries:

          boost_filesystem

  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.
Call Stack (most recent call first):
  CMakeLists.txt:6 (find_package)


-- Configuring incomplete, errors occurred!
See also "D:/Cpp/MyProject/cmake-build-debug/CMakeFiles/CMakeOutput.log".

[Failed to reload]

Очевидно, он не может найти filesystem, но он есть в C:\Boost\boost\filesystem (здесь - это документация на FindBoost). Компиляция C++ с Boost 1.68.0 в Windows с использованием CMake и MinGW

Как мне настроить мой файл CMake для правильного использования Boost? Я также попытался установить переменные среды Boost, но это все равно не сработало:

SET (BOOST_ROOT "c:/Boost")
SET (BOOST_INCLUDEDIR "c:/Boost/boost")
SET (BOOST_LIBRARYDIR "c:/Boost/libs")

FIND_PACKAGE(Boost 1.68.0 REQUIRED COMPONENTS filesystem)

Похоже, вы используете неправильный cmake, возможно, вы хотите проверить свой приоритет PATH и опустить JetBrains на дно.

Havenard 18.11.2018 19:31

Вы скомпилировали библиотеку boost с помощью mingw? Ваша ссылка для скачивания - это исходный код, а не двоичные файлы mingw. Также помните, что вы не можете использовать двоичные файлы Visual Studio. Если вы загружаете двоичные файлы, убедитесь, что они были скомпилированы для вашего toochain.

drescherjm 18.11.2018 19:37

Поскольку я использую CLion от Jetbrains, это правильная версия CMake. Кроме того, Boost говорит, что большинство вещей не нужно компилировать, поэтому я этого не делал.

BullyWiiPlaza 18.11.2018 19:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
1 527
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Also, Boost says that most things don't have to be compiled so I didn't do that.

Он не может найти библиотека boost :: filesystem. Потому что boost :: filesystem - одна из немногих библиотек, которые необходимо скомпилировать (все те, которые вы должны указать в команде find package имеют для компиляции).

Сначала вам нужно построить буст:

./booststrap.sh

А потом:

bjam

Он выбирает любой доступный компилятор, поэтому вам, возможно, придется установить правильный набор инструментов вручную.

Для Windows на самом деле это bootstrap.bat, а bjam без аргументов строит все, что слишком много. Кроме того, даже после этого CMake не распознает скомпилированные библиотеки.

BullyWiiPlaza 19.11.2018 08:54

Для cygwin вам может понадобиться sh-версия. Какой компилятор он выбрал?

Matthieu Brucher 19.11.2018 08:56

Он выбрал MSVC v141, но он мне больше не нужен из-за более простого решения, которое я нашел: stackoverflow.com/a/53375582/3764804

BullyWiiPlaza 19.11.2018 22:49

Конечно, это было моей точкой зрения, вам нужна gcc-версия Boost для Windows, а не VS ...

Matthieu Brucher 19.11.2018 22:55

Не полностью связано, но я думаю, что ваша строка ссылки неверна, а не:

target_link_libraries(MyExecutable Boost::filesystem)

он должен сказать:

target_link_libraries(MyExecutable ${Boost_LIBRARIES})

Boost_LIBRARIES определяется автоматически после обнаружения Boost, так что это бесплатно.

Вы не ошиблись, но это не решает проблему, поэтому вместо этого должен был быть комментарий. Я полагаю, тебе не хватало репутации для этого ...

BullyWiiPlaza 24.11.2018 22:34

Действительно, мой комментарий не просто не решил проблему, он был неправильным. На самом деле использование Boost::filesystem лучше, чем ${Boost_LIBRARIES}, поскольку первый включает только то, что требуется, а второй включает ВСЕ библиотеки, запрошенные через find_package() (хотя в этом случае они обе совпадают). Мои извинения.

Alvaro Palma Aste 19.07.2019 16:42

Макрос CMake FindBoost заполняет библиотеки Boost_Libraries только в том случае, если find_package содержит раздел COMPONENTS и макрос действительно находит эти библиотеки на диске.

Итак, здесь я бы сказал, что мне нужно найти Boost И у него должна быть файловая система

find_package(Boost 1.66.0 REQUIRED COMPONENTS filesystem)

Затем макрос пытается создать кучу потенциальных имен файлов для файловой системы (с учетом того, нужна ли мне общая версия, отладка, многопоточность и т. д.), И ищет эти имена в Boost_ROOT. Если он не найдет файл, это может привести к ошибке и не заполнить Boost_Libraries.

Если сомневаетесь, добавьте такую ​​строку в CMake перед find_packages (), чтобы увидеть, какие библиотеки ищет макрос, и сравнить с тем, что у вас есть на самом деле:

set (Boost_DEBUG ON)

Что касается меня, я обнаружил, что у меня есть Boost, который размещает версии библиотек с архитектурой -x32 и -x64, например "libboost_system-mgw92-mt-x64-1_66.a". Макрос не вставил префикс архитектуры в имя файла, который искал, и завершился ошибкой.

Мне пришлось добавить такую ​​строку, чтобы дать макросу подсказку, какую версию я хочу:

set (Boost_ARCHITECTURE "-x64")

После этого $ {Boost_Libraries} правильно расширился, и я смог правильно использовать его для ссылки.

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