【发布时间】:2019-07-02 01:32:45
【问题描述】:
背景
我是一个 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 似乎应该给我我想要的东西(方便且可重复的跨平台构建,几乎没有或没有依赖问题)
我的源代码(直接来自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 在 Windows 上入门 - 1.69.0”,但它链接到 Boost 版本 1.67.0)
下载并解压 ZIP 文件后,我有一堆乱七八糟的文件 - 但不知道把它们放在哪里:
目前为止的工作尝试
我尝试add the Boost library to my project,但没有任何预期的菜单选项可用:
虽然我 couldn't find a single page 会警告你这个问题,但显然 CMake 项目没有难以捉摸的“属性”窗口——而是必须以某种方式包含第三方库通过 CMakeLists.txt 文件
对于初学者,我将 Boost ZIP 文件的整个 540 MB 内容复制到我的项目中名为“Boost”的文件夹下:
然后我尝试了一系列不同的 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()
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 收到关于 @ 的错误987654355@。事实上,关于那些“CMakeLists.txt”错误,在我的文件中添加了 enough 行之后,我开始定期使 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 的东西怎么不适合我?
【问题讨论】:
-
尝试使用基于目标的 API。
target_link_libraries(you_exe PUBLIC boost::lambda)这条命令应该添加包含目录以及链接库。 -
@GuillaumeRacicot imgur.com/ChwBo57 运气不好
-
要使用 target 你必须首先找到 boost 包:
find_package(Boost COMPONENT lambda REQUIRED) -
所以
find_package(Boot COMPONENTS lambda REQUIRED)抛出错误“无法找到请求的 Boost 库。请将 BOOST_ROOT 设置为根目录...”。然后我添加了set(BOOST_ROOT "C:\\local\\boost_1_69_0"),第一次看到“Boost 版本:1.69.0”(正在取得进展!)紧接着是“找不到以下 Boost 库:lambda。没有找到 Boost 库。您可能需要设置BOOST_LIBRARYDIR……”。我试过set(BOOST_LIBRARYDIR "${BOOST_ROOT}\\libs")(除其他外)但还没有运气 -
我第一次尝试使用 boost 时遇到了类似的错误。我现在不在我的主计算机上,当我可以物理访问它时,我会通知你。我知道我设法让它发挥作用。据我记得,cmake 没有正确检测到较新的 boost 版本,但我现在不能 100% 确定。
标签: c++ visual-studio boost cmake