Я хочу использовать библиотеку Boost на Windows, но это было хлопотно. Я загрузил пакет Windows из здесь и распаковал его в C:\Boost:
Я добавил в свой файл 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).

Как мне настроить мой файл 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)
Вы скомпилировали библиотеку boost с помощью mingw? Ваша ссылка для скачивания - это исходный код, а не двоичные файлы mingw. Также помните, что вы не можете использовать двоичные файлы Visual Studio. Если вы загружаете двоичные файлы, убедитесь, что они были скомпилированы для вашего toochain.
Поскольку я использую CLion от Jetbrains, это правильная версия CMake. Кроме того, Boost говорит, что большинство вещей не нужно компилировать, поэтому я этого не делал.





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 не распознает скомпилированные библиотеки.
Для cygwin вам может понадобиться sh-версия. Какой компилятор он выбрал?
Он выбрал MSVC v141, но он мне больше не нужен из-за более простого решения, которое я нашел: stackoverflow.com/a/53375582/3764804
Конечно, это было моей точкой зрения, вам нужна gcc-версия Boost для Windows, а не VS ...
Не полностью связано, но я думаю, что ваша строка ссылки неверна, а не:
target_link_libraries(MyExecutable Boost::filesystem)
он должен сказать:
target_link_libraries(MyExecutable ${Boost_LIBRARIES})
Boost_LIBRARIES определяется автоматически после обнаружения Boost, так что это бесплатно.
Вы не ошиблись, но это не решает проблему, поэтому вместо этого должен был быть комментарий. Я полагаю, тебе не хватало репутации для этого ...
Действительно, мой комментарий не просто не решил проблему, он был неправильным. На самом деле использование Boost::filesystem лучше, чем ${Boost_LIBRARIES}, поскольку первый включает только то, что требуется, а второй включает ВСЕ библиотеки, запрошенные через find_package() (хотя в этом случае они обе совпадают). Мои извинения.
Макрос 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} правильно расширился, и я смог правильно использовать его для ссылки.
Похоже, вы используете неправильный cmake, возможно, вы хотите проверить свой приоритет
PATHи опустить JetBrains на дно.