gpt4 book ai didi

c++ - 将 Boost 添加到 CMake 项目?

转载 作者:太空狗 更新时间:2023-10-29 20:50:27 27 4
gpt4 key购买 nike

背景

我是 C++ 的完全新手,我一直在一个接一个地头痛,所以如果这非常简单,请原谅我,我是 就是那个笨蛋 ...

我有一个最终应该在 Linux 中编译和运行的项目。不幸的是之后lots of issues with my C++ development environemnt (仍未解决),我放弃了在 Linux 中进行开发的尝试,转而使用了 Windows Visual Studio 2017。我的希望是让我的代码在 Windows 中运行,然后,由于 C++ 被认为是一种可移植语言,它应该只在 Linux 中运行最小的变化。

一天左右,Visual Studio 似乎在工作。我可以编写代码,点击“编译”,然后就像魔法一样运行。我把几个类放在一起构建了一个有向无环图,使用了哈希表的标准库,然后我尝试创建了一个套接字......

Windows 和 Linux 使用不同的套接字库( <sys/socket.h><winsock.h> ),所以我需要一些方法来抽象差异,我更喜欢一个完善的标准。谷歌搜索我发现the Boost library这似乎符合我的需要......那时一切都变得糟糕透顶。

我的项目设置

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

Creating a new project, pt 1
Creating a new project, pt 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

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

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

Boost download directory

尝试让它发挥作用

我试过 add the Boost library to my project ,但没有任何预期的菜单选项可用:

Right-clicking on project in Solution Explorer

虽然我 couldn't find a single page警告你这个问题,显然 CMake 项目没有难以捉摸的“属性”窗口 - 而第三方库必须以某种方式通过 CMakeLists.txt 文件包含

首先,我复制了 整个 Boost ZIP 文件的 540 MB 内容到我的项目中的文件夹名称“Boost”下:

Boost in project

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

How do you add Boost libraries in CMakeLists.txt? :
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 硬盘驱动器——所以我印象深刻的是,文本文件中的几行足以让我的计算机在以下位置锁定 10 分钟一个时间。

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

New project setup

现在,再次,我是 C/C++ 开发的新手,所有可能出错的地方都出错了。到目前为止,我已经花了将近两周的时间,几乎没有设法在两台计算机、三个 IDE 和四个编译器上编译一个“Hello, World”应用程序。我还没有取得任何成功,包括来自任何地方、任何流行级别或简单级别的第三方库,并且实际上编译了一个引用该库的功能程序。所以请相信我,当我说:我不知道“仅 header 库”和......无论替代方案是什么之间的区别。我只知道,根据 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 等价物这样简单的东西怎么对我不起作用?

最佳答案

以下食谱应该有效
official boost binaries location 下载 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})
因为我们使用了 REQUIREDfind_package调用,如果找不到,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 ...) 上有哪些可用选项电话见 FindBoost CMake 中的文档。
仅标题库
如果你的库只有标题,你需要从 find_package(Boost ...) 中省略它们称呼。查看哪些库是 不是 标题只看到这个 post .
使用较新的 Boost 版本
如果您的 CMake 安装找不到请求的版本,例如1.69.0,但支持最新 Boost 版本的命名方案,您可以将其与 set(Boost_ADDITIONAL_VERSIONS "1.69.0" "1.69") 一起使用. Boost 命名方案的最后一次更改是从 1.65.1 到 1.66。

关于c++ - 将 Boost 添加到 CMake 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54581717/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com