使用 CMake 和 MinGW 在 Windows 上使用 Boost 1.68.0 编译 C++
Compiling C++ with Boost 1.68.0 on Windows using CMake and MinGW
我想在Windows
上使用Boost
库,但是这样做很麻烦。我从 here 下载了 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-03.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
中(here 是关于 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)
Also, Boost says that most things don't have to be compiled so I didn't do that.
找不到 库 boost::filesystem。因为boost::filesystem是少数几个需要编译的库之一(所有你在find package命令中指定的库都有需要编译)
您需要先构建 boost:
./booststrap.sh
然后:
bjam
它会选择任何可用的编译器,因此您可能必须手动设置适当的工具集。
不完全相关,但我认为您的 link 行不正确,而不是:
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.
如果有疑问,请在 find_packages() 之前向您的 CMake 添加一行,以查看宏正在寻找的库并与您实际拥有的库进行比较:
set (Boost_DEBUG ON)
对我来说,我发现我有一个 Boost,它放置了库的 -x32 和 -x64 架构版本,例如"libboost_system-mgw92-mt-x64-1_66.a"。宏没有将体系结构前缀填充到它正在查找的文件名中,因此失败。
我不得不添加一行这样的代码来为宏提供我想要哪个版本的线索:
set (Boost_ARCHITECTURE "-x64")
在那之后 ${Boost_Libraries} 正确扩展,我能够正确地将它用于 link。
我想在Windows
上使用Boost
库,但是这样做很麻烦。我从 here 下载了 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-03.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
中(here 是关于 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)
Also, Boost says that most things don't have to be compiled so I didn't do that.
找不到 库 boost::filesystem。因为boost::filesystem是少数几个需要编译的库之一(所有你在find package命令中指定的库都有需要编译)
您需要先构建 boost:
./booststrap.sh
然后:
bjam
它会选择任何可用的编译器,因此您可能必须手动设置适当的工具集。
不完全相关,但我认为您的 link 行不正确,而不是:
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.
如果有疑问,请在 find_packages() 之前向您的 CMake 添加一行,以查看宏正在寻找的库并与您实际拥有的库进行比较:
set (Boost_DEBUG ON)
对我来说,我发现我有一个 Boost,它放置了库的 -x32 和 -x64 架构版本,例如"libboost_system-mgw92-mt-x64-1_66.a"。宏没有将体系结构前缀填充到它正在查找的文件名中,因此失败。
我不得不添加一行这样的代码来为宏提供我想要哪个版本的线索:
set (Boost_ARCHITECTURE "-x64")
在那之后 ${Boost_Libraries} 正确扩展,我能够正确地将它用于 link。