【问题标题】:Compiling C++ with Boost 1.68.0 on Windows using CMake and MinGW使用 CMake 和 MinGW 在 Windows 上使用 Boost 1.68.0 编译 C++
【发布时间】:2018-11-18 18:27:49
【问题描述】:

我想在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-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 上的文档)。

如何设置我的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 的东西推到底部。
  • 你用mingw编译过boost库吗?您的下载链接是源代码而不是 mingw 二进制文件。另请记住,您不能使用 Visual Studio 二进制文件。如果您确实下载了为您的工具链编译的二进制文件,请确保您。
  • 因为我使用的是CLion by Jetbrains,所以它是正确的CMake 版本。另外,Boost 说大多数东西都不需要编译,所以我没有这样做。

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


【解决方案1】:

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

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

你需要先构建 boost:

./booststrap.sh

然后:

bjam

它会选择任何可用的编译器,因此您可能必须手动设置正确的工具集。

【讨论】:

  • 对于Windows,它实际上是bootstrap.batbjam,没有参数会构建太多的东西。此外,即使在这样做之后,CMake 也不会识别已编译的库
  • 对于 cygwin,您可能需要设置 sh 版本。它选择了什么编译器?
  • 它选择了MSVC v141,但由于我找到了一个更简单的解决方案,我不再需要它:stackoverflow.com/a/53375582/3764804
  • 当然,这是我的意思,你需要有 Boost for Windows 的 gcc 版本,而不是 VS...
【解决方案2】:

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

target_link_libraries(MyExecutable Boost::filesystem)

应该说:

target_link_libraries(MyExecutable ${Boost_LIBRARIES})

Boost_LIBRARIES 是在找到 Boost 后自动定义的,因此是免费的。

【讨论】:

  • 您没有错,但这并不能解决问题,因此应该改为评论。我猜你缺乏这样做的声誉......
  • 确实,我的评论不仅没有解决问题,而且是不正确的。实际上使用Boost::filesystem${Boost_LIBRARIES} 更好,因为前者只包含所需的内容,而后者包括通过find_package() 请求的所有库(尽管在这种情况下,它们都匹配)。我很抱歉。
【解决方案3】:

如果 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,它放置了一个 -x32 和 -x64 架构版本的库,例如“libboost_system-mgw92-mt-x64-1_66.a”。宏没有将架构前缀填充到它正在寻找的文件名中并且失败了。

我必须添加这样的一行来为宏提供我想要的版本的线索:

set (Boost_ARCHITECTURE "-x64")

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2020-11-22
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多