使用CMake和MinGW在Windows上使用Boost 1.68.0编译C ++

时间:2018-11-18 18:27:50

标签: c++ windows boost cmake boost-filesystem

我想在Boost上使用Windows库,但是这样做很麻烦。我从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-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中(hereFindBoost上的文档)。 enter image description here

如何设置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)

3 个答案:

答案 0 :(得分:2)

  

另外,Boost说大多数东西都不需要编译,所以我没有这么做。

找不到 boost :: filesystem。因为boost :: filesystem是需要编译的少数几个库之一(必须在find软件包命令中指定的所有库中都有要编译)。

您需要先建立增强功能:

./booststrap.sh

然后:

bjam

它将选择可用的编译器,因此您可能必须手动设置适当的工具集。

答案 1 :(得分:1)

不完全相关,但是我认为您的链接行不正确,而不是:

target_link_libraries(MyExecutable Boost::filesystem)

它应该说:

target_link_libraries(MyExecutable ${Boost_LIBRARIES})
一旦找到Boost,就会自动定义

Boost_LIBRARIES ,因此它是免费的。

答案 2 :(得分:0)

仅当find_package包含COMPONENTS部分并且该宏实际上在磁盘上找到这些库时,CMake FindBoost宏才会填充Boost_Libraries。

所以在这里我要说我需要找到Boost,并且它必须具有文件系统

find_package(Boost 1.66.0 REQUIRED COMPONENTS filesystem)

宏然后尝试为文件系统构造一堆潜在的文件名(如果需要共享版本,调试,多线程等,请考虑在内)并在Boost_ROOT下搜索那些名称。如果找不到该文件,则可能会出错,并且不会填写Boost_Libraries。

如果有疑问,请在find_packages()之前在您的CMake中添加这样的行,以查看宏正在寻找的库并与您实际拥有的库进行比较:

set (Boost_DEBUG ON)

对我来说,我发现我有一个Boost,它放置了libs的-x32和-x64体系结构版本,例如“ libboost_system-mgw92-mt-x64-1_66.a”。宏没有在要查找的文件名中填充架构前缀,但失败了。

我必须添加这样的行才能为宏提供我想要哪个版本的线索:

set (Boost_ARCHITECTURE "-x64")

之后,$ {Boost_Libraries}正确扩展了,我能够正确地使用它进行链接了。