将 Boost 添加到 CMake 项目?

新手上路,请多包涵

背景

我是一个 C++ 的新手,我一个接一个地头疼,所以如果这非常简单而且我 就是那么愚蠢,请原谅我……

我有一个最终应该在 Linux 中编译和运行的项目。不幸的是,在 我的 C++ 开发环境出现很多问题(仍未解决)之后,我放弃了尝试在 Linux 中进行开发并转向 Windows Visual Studio 2017。我希望让我的代码在 Windows 中工作,然后,因为 C++ 被认为是可移植语言,它应该只在 Linux 中工作,只需进行最小的更改。

Visual Studio 似乎工作了一天左右。我可以编写代码,点击“编译”,它会像魔术一样运行。我拼凑了几个类来构造一个有向无环图,使用标准库作为哈希表,然后我尝试创建一个套接字……

Windows 和 Linux 对套接字使用不同的库( <sys/socket.h> vs <winsock.h> )所以我需要一些方法来抽象差异,我更喜欢一个完善的标准。谷歌搜索后,我发现 Boost 库 似乎符合我的需求……那是一切都陷入困境的时候。

我的项目设置

因为这个项目将在各种平台和 IDE 上开发(有些人使用 Windows + Visual Studio,有些人使用 Mac + Eclipse,而其他人使用 Linux + VIM)我选择将其作为 CMake 项目。经过几个小时的阅读、学习和研究,CMake 似乎应该给我我想要的东西(方便且可重复的跨平台构建,几乎没有或没有依赖问题)

创建一个新项目,pt 1创建一个新项目,第 2 部分

我的源代码(直接来自 Boost Getting Started on Windows 指南)如下:

CMakeProject2.cpp

 #include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    using namespace boost::lambda;
    typedef std::istream_iterator<int> in;

    std::for_each(
        in(std::cin), in(), std::cout << (_1 * 3) << " ");
}

根据 Boost Getting Started on Windows 指南,我从这里下载了 Boost:

https://dl.bintray.com/boostorg/release/1.67.0/source/boost_1_67_0.zip

(有趣的是,入门指南的标题是“Boost Getting Started on Windows - 1.69.0”,但它链接到 Boost 版本 1.67.0)

下载并解压 ZIP 文件后,我有一大堆文件——但不知道把它们放在哪里:

提升下载目录

尝试让它工作至今

我尝试 将 Boost 库添加到我的项目 中,但没有任何预期的菜单选项可用:

在解决方案资源管理器中右键单击项目

虽然我 找不到 一个 页面 警告你这个问题,但显然 CMake 项目没有难以捉摸的 属性”窗口——相反,第三方库必须以某种方式通过 CMakeLists.txt 文件包含在内

对于初学者,我将 Boost ZIP 文件的 全部 540 MB 内容复制到我的项目中的文件夹名称“Boost”下:

项目推进

然后我尝试了一系列不同的 CMakeList.txt 命令:

根据 如何在 CMakeLists.txt 中添加 Boost 库?

 set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost REQUIRED COMPONENTS lambda)

if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    add_executable(CMakeProject2 "CMakeProject2.cpp" "CMakeProject2.h")
    target_link_libraries(CMakeProject2 ${Boost_LIBRARIES})
endif()

根据 https://www.selectiveintellect.net/blog/2016/7/29/using-cmake-to-add-third-party-libraries-to-your-project-1

 include("Boost")
add_subdirectory("Boost")
add_subdirectory("boost")
add_subdirectory("Boost/boost")
add_subdirectory("Boost/boost/lambda")

target_link_libraries(boost)
target_link_libraries(Boost)

根据 https://cmake.org/pipermail/cmake/2009-November/033249.html

 SET (Boost_FIND_REQUIRED TRUE)
SET (Boost_FIND_QUIETLY TRUE)
SET (Boost_DEBUG FALSE)
set (Boost_USE_MULTITHREADED TRUE)
set (Boost_USE_STATIC_LIBS TRUE)
SET (Boost_ADDITIONAL_VERSIONS "1.67" "1.67.0")

FIND_PACKAGE(Boost COMPONENTS  lambda)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

我尝试了其他几种咒语(不熟悉 C++ CMake 作为工具),要么从 CMakeLists.txt 或从 CMakeProject2.cpp 收到关于 cannot open source file "boost/lambda/lambda.hpp" 的错误。事实上,关于那些“CMakeLists.txt”错误,在我的文件中添加 了足够 多的行之后,我开始定期让 Visual Studio 崩溃。请注意,我有一个第 8 代 i7、32 GB 的 RAM 和一个 M.2 NVMe 硬盘驱动器 - 所以我印象深刻的是,文本文件中的几行足以让 Microsoft 将我的计算机锁定 10 分钟一次。

所有这些都失败了,我尝试将我需要的文件直接复制到我的项目中:

新项目设置

现在,再次,我是 C/C++ 开发的新手,所有可能出错的地方 出错了。到目前为止,我已经花了将近两个星期的时间,勉强在两台计算机、三个 IDE 和四个编译器上编译了一个“Hello, World”应用程序。我还没有取得任何成功,包括来自任何地方、任何流行程度或简单程度的第三方库,并且实际上编译了一个引用该库的功能程序。因此,当我说:我不知道“仅标题库”和……无论替代方案是什么时,请相信我。我只知道,根据 Boost Getting Started on Windows 指南, 大多数 Boost 都是“仅标题”,因此我不应该有任何构建步骤——它应该很容易使用。此外,这个例子(使用 boost::lambda )是 - 根据他们的说明 - 一个仅限标头的库,因此应该非常易于使用。

我现在稍微更新了源代码以查看当前目录,而不是查看系统包含目录(据我目前所知,Windows 中不存在该目录):

 #include "boost/lambda/lambda.hpp"
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    using namespace boost::lambda;
    typedef std::istream_iterator<int> in;

    std::for_each(
        in(std::cin), in(), std::cout << (_1 * 3) << " ");
}

现在我可以 手动验证 此文件是否存在(文件 CMakeProject2\CMakeProject2\boost\lambda\lambda.hpp 可以在文件资源管理器中找到) - 但我 仍然 遇到错误:

cannot open source file "boost/lambda/lambda.hpp"

进一步的谷歌搜索使我再次更新了我的 CMakeLists.txt 文件,将其置于当前形式:

 # CMakeList.txt : CMake project for CMakeProject2, include source and define
# project specific logic here.
#
cmake_minimum_required (VERSION 3.8)

# Add source to this project's executable.
file(GLOB CMakeProject2_SRC
    "*.h"
    "*.cpp"
    "**/*.h"
    "**/*.cpp"
    "**/*.hpp"
    "boost/lambda/lambda.hpp"
)
add_executable (CMakeProject2 ${CMakeProject2_SRC})
#add_executable (CMakeProject2 "CMakeProject2.cpp" "CMakeProject2.h")

# TODO: Add tests and install targets if needed.

尽管如此,我 仍然 收到错误消息:

cannot open source file "boost/lambda/lambda.hpp"

在这一点上,我正在扯掉我的头发。我究竟做错了什么?我不知道什么?像“Hello, World”这样简单的 Boost 等效项怎么对我不起作用?

原文由 stevendesu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
1 个回答

以下食谱应该有效

官方 boost 二进制文件位置 下载 Boost 二进制文件并安装到 C:\Boost

大多数时候,您不需要自己构建 Boost。

您的 CMakeLists.txt 应如下所示

cmake_minimum_required (VERSION 3.8)

project(boostAndCMake)

set(BOOST_ROOT "C:\Boost") # either set it here or from the command line
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost REQUIRED COMPONENTS system) # header only libraries must not be added here

add_executable(CMakeProject2 CMakeProject2.cpp CMakeProject2.h)
target_include_directories(CMakeProject2 PUBLIC ${Boost_INCLUDE_DIRS})
target_link_libraries(CMakeProject2 ${Boost_LIBRARIES})

因为我们在 find_package 调用中使用了 REQUIRED ,如果找不到,CMake 将执行失败并跳过脚本的其余部分。所以无需检查 Boost_FOUND 。当您省略 REQUIRED 时,您需要检查它。

现在从脚本所在目录的命令行调用:

 cmake -H. -Bbuildit -G "Visual Studio 15 2017" -DBOOST_ROOT=C:\Boost

这将在当前目录中创建一个名为 buildit 的构建目录,进一步在构建目录中为 Visual Studio 2017 创建一个解决方案,并为在 BOOST_ROOT find_package 设置调用以识别您计算机上的 Boost 目录。要查看 find_package(Boost ...) 调用上可用的选项,请参阅 CMake 中的 FindBoost 文档。

仅标头库

如果您的库只是标题,您需要从 find_package(Boost ...) 调用中省略它们。要查看哪些库 不是 标头,请参见这篇 文章

使用较新的 Boost 版本

如果您的 CMake 安装找不到请求的版本,例如 1.69.0,但支持更新的 Boost 版本的命名方案,您可以将其与 set(Boost_ADDITIONAL_VERSIONS "1.69.0" "1.69") 一起使用。 Boost 命名方案的最后一次更改是从 1.65.1 到 1.66。

原文由 vre 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题