背景
我完全不懂C++,遇到了一个又一个的问题,所以如果这很简单而且我“只是那么愚蠢”,请原谅我...
我的项目应该最终在Linux中编译和运行。不幸的是,在我的C++开发环境遇到了很多问题(仍未解决)之后,我放弃了在Linux中开发,并转向Windows Visual Studio 2017。我希望先在Windows中让我的代码工作,然后,由于C ++被认为是一种便携式语言,它应该只需要进行最少量的更改就可以在Linux中正常工作。
Visual Studio似乎工作了一天左右。我可以编写代码,点击“编译”,然后像魔术一样运行。我组合了几个类来构建有向无环图,使用标准库进行哈希表,然后我尝试创建一个套接字......
Windows和Linux使用不同的套接字库(<sys/socket.h>
vs <winsock.h>
),因此我需要某种方式来抽象出差异,并且我更喜欢一个成熟的标准。在Google上搜索时,我找到了Boost库,似乎符合我的需求......这就是一切都变得糟糕的时候。
我的项目设置
因为这个项目将在多个平台和IDE上开发(有些人使用Windows + Visual Studio,有些人使用Mac + Eclipse,其他人使用Linux + VIM),所以我选择将其作为CMake项目。经过几个小时的阅读、学习和研究,似乎CMake应该能够给我想要的东西(方便且可重复的跨平台构建,几乎没有依赖问题)。我的源代码(直接来自Boost在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) << " ");
}
根据在Windows上开始使用Boost指南,我从这里下载了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库添加到我的项目中, 但是没有出现任何预期的菜单选项:
尽管我无法 找到 任何 一个 页面来警告你这个陷阱,显然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中收到“无法打开源文件“boost/lambda/lambda.hpp””的错误。实际上,关于那些“CMakeLists.txt”的错误,在我的文件中添加了足够的行后,我开始经常崩溃Visual Studio。请注意,我有第八代i7、32GB的RAM和一个M.2 NVMe硬盘——所以我相当惊讶,几行文本文件足以惹恼微软,让我的电脑每次锁定10分钟。
如果所有这些都失败了,我尝试将我需要的文件直接复制到我的项目中:
现在,我是C/C++开发的新手,所有可能出错的事情都出错了。到目前为止,我花了将近两个星期的时间,在两台电脑上、三个IDE和四个编译器上勉强编译出一个"Hello, World"应用程序。我还没有成功地引入任何第三方库,无论是从哪里下载的,无论其受欢迎程度或简单程度如何,也没有编译出引用该库的可运行程序。所以当我说:我不知道"只有头文件库"和...其他什么区别时,请相信我。我只知道根据在Windows上开始使用Boost指南,大部分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) - 但我仍然会收到错误消息:“无法打开源文件“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.
尽管如此,我仍然遇到了错误:
无法打开源文件 "boost/lambda/lambda.hpp"
。此时我快要抓狂了。我做错了什么?我不知道什么?为什么像"Hello, World"这样简单的Boost等效物对我不起作用?
target_link_libraries(you_exe PUBLIC boost::lambda)
这个单一命令应该会添加包含目录以及链接库。 - Guillaume Racicotfind_package(Boost COMPONENT lambda REQUIRED)
。 - Guillaume Racicot