Справочная информация
Я - полный новичок в C ++, и у меня одна головная боль за другой, так что простите, если это невероятно просто, и я просто тактупой ...
У меня есть проект, который в конечном итоге должен компилироваться и запускаться в Linux.К сожалению, после множества проблем с моей средой разработки на C ++ (все еще не решенных) я перестал пытаться разрабатывать в Linux и перешел на Windows Visual Studio 2017. Я надеялся, что мой код заработает в Windows, а затемТак как C ++ предположительно является переносимым языком, он должен просто работать в Linux с минимальными изменениями.
В течение дня или около того Visual Studio, казалось, работал.Я мог бы написать код, нажать «compile», и, как по волшебству, он запустится.Я собрал несколько классов для построения ориентированного ациклического графа, использовал стандартную библиотеку для хеш-таблицы, а затем попытался создать сокет ...
В Windows и Linux используются разные библиотеки для сокетов (<sys/socket.h>
vs <winsock.h>
) поэтому мне нужен был какой-то способ абстрагировать различия, и я предпочел хорошо установленный стандарт.Погуглив, я нашел библиотеку Boost , которая, казалось, соответствовала моим потребностям ... Вот тогда все и пошло к черту.
Настройка моего проекта
Поскольку этот проект будет разработанна различных платформах и IDE (некоторые люди используют Windows + Visual Studio, некоторые люди используют Mac + Eclipse, а другие используют Linux + VIM), я решил сделать его проектом CMake.После нескольких часов чтения, изучения и исследования кажется, что CMake должен дать мне то, что я хочу (удобные и воспроизводимые кроссплатформенные сборки без проблем с зависимостями или без них)

Мой исходный код (непосредственно из руководства Boost Getting Started в 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 для Windows , я скачал Boost здесь:
https://dl.bintray.com/boostorg/release/1.67.0/source/boost_1_67_0.zip
(интересноруководство по началу работы называется «Boost Getting Started в Windows - 1.69.0», но оно связано с Boost версий 1.67.0)
После загрузки и распаковки ZIP-файла у меня возникла целая куча файлов- но не знаю, где их поставить:

Попытки заставить его работать до сих пор
Я пытался добавитьбиблиотека Boost для моего проекта , но ни один из ожидаемых пунктов меню не был доступен:

Хотя я не смог найти a single страница , которая предупреждает вас об этом, очевидно, проекты CMake не имеют неуловимого окна «Свойства» - и вместо этого сторонние библиотеки должны как-то включаться через файл CMakeLists.txt
Для начала я скопировал все 540 МБ содержимого файла Boost ZIP в мой проект под именем папки "Boost":

Затем я попробовал ряд различных команд CMakeList.txt:
Per Как добавить библиотеки Boost в 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 гигабайта оперативной памяти и жесткий диск M.2 NVMe - поэтому я был весьма впечатлен, что несколько строк в текстовом файле отошли от Microsoft достаточно, чтобы заблокировать мой компьютер на 10 минут привремя.
В противном случае я попытался скопировать нужные файлы непосредственно в мой проект:

Опять же, я новичок в разработке на C / C ++, и все, что может пойти не так , пошло не так.До сих пор я провел почти две недели и едва успел скомпилировать одно приложение «Hello, World» на двух компьютерах, трех IDE и четырех компиляторах.Мне еще не удалось добиться успеха, включая стороннюю библиотеку, откуда угодно, любого уровня популярности или уровня простоты, и на самом деле собрать работающую программу, которая ссылается на библиотеку.Так что поверьте мне, когда я скажу: я не знаю разницы между «библиотекой только для заголовков» и ... какой бы ни была альтернатива.Я просто знаю, что, согласно руководству Boost Getting Started для Windows , большинство Boost - это «только заголовки», и поэтому у меня не должно быть никакой сборкишаг - это должно быть просто использоватьКроме того, этот пример (с использованием boost::lambda
) - согласно их инструкциям - библиотека только для заголовка, и поэтому должен быть чрезвычайно прост в использовании.
Теперь я немного обновил исходный код, чтобы посмотреть в текущем каталогевместо того, чтобы искать в системном каталоге include (который, насколько мне известно на данный момент, в 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"
В этот момент я вырываю свои волосы.Что я делаю неправильно?Что я не знаю?Как у меня не работает что-то такое же простое, как Boost-эквивалент "Hello, World"?