Компиляция C++ с Boost 1.68.0 в Windows с использованием CMake и MinGW
Я хочу использовать 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)
2 ответа
Кроме того, Boost говорит, что большинство вещей не нужно компилировать, поэтому я этого не делал.
Не удается найти библиотеку boost::filesystem. Потому что boost:: filesystem - одна из немногих библиотек, которые нужно скомпилировать (нужно скомпилировать все те, которые вы должны указать в команде find package).
Вам нужно сначала создать boost:
./booststrap.sh
А потом:
bjam
Он выбирает любой доступный компилятор, поэтому вам, возможно, придется вручную установить подходящий набор инструментов.
Не полностью связаны, но я думаю, что ваша ссылка неверна, вместо:
target_link_libraries(MyExecutable Boost::filesystem)
это должно сказать:
target_link_libraries(MyExecutable ${Boost_LIBRARIES})
Boost_LIBRARIES автоматически определяется после того, как Boost найден, так что это бесплатно.
Макрос 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} расширился правильно, и я смог правильно использовать его для ссылки.