背景
我是一个 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 似乎应该给我我想要的东西(方便且可重复的跨平台构建,几乎没有或没有依赖问题)
我的源代码(直接来自 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()
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 许可协议
以下食谱应该有效
从 官方 boost 二进制文件位置 下载 Boost 二进制文件并安装到 C:\Boost
大多数时候,您不需要自己构建 Boost。
您的 CMakeLists.txt 应如下所示
因为我们在
find_package
调用中使用了REQUIRED
,如果找不到,CMake 将执行失败并跳过脚本的其余部分。所以无需检查Boost_FOUND
。当您省略REQUIRED
时,您需要检查它。现在从脚本所在目录的命令行调用:
这将在当前目录中创建一个名为 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。