Добавление Boost к проекту CMake? - PullRequest
0 голосов
/ 07 февраля 2019

Справочная информация

Я - полный новичок в 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 должен дать мне то, что я хочу (удобные и воспроизводимые кроссплатформенные сборки без проблем с зависимостями или без них)

Creating a new project, pt 1 Creating a new project, pt 2

Мой исходный код (непосредственно из руководства 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 download directory

Попытки заставить его работать до сих пор

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

Right-clicking on project in Solution Explorer

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

Для начала я скопировал все 540 МБ содержимого файла Boost ZIP в мой проект под именем папки "Boost":

Boost in project

Затем я попробовал ряд различных команд 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 минут привремя.

В противном случае я попытался скопировать нужные файлы непосредственно в мой проект:

New project setup

Опять же, я новичок в разработке на 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"?

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Следующий рецепт должен работать

Загрузите двоичные файлы Boost из официального местоположения двоичных файлов 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})

Поскольку мы использовали REQUIRED при вызове find_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.

0 голосов
/ 08 февраля 2019

Вот рабочая настройка для Boost 1.68 с CMake 3.12.Boost 1.69, по-видимому, «слишком новый» для cmake, чтобы правильно его обнаружить.Так как повышение не может быть скомпилировано с помощью cmake, сам cmake должен предоставить модуль FindBoost.cmake, который должен идти в ногу с изменениями повышения.

Так или иначе, CMakeLists.txt такой же маленький, как этот:

cmake_minimum_required(VERSION 3.11)

project(foobar)

find_package(Boost 1.68 REQUIRED)
add_executable(foo foo.cpp)
target_link_libraries(foo PUBLIC Boost::boost)

Конечно, вы можете разбить его на множество подкаталогов.

Вызов CMake в командной строке должен выглядеть следующим образом:

cmake -DCMAKE_PREFIX_PATH=path_to_local_directory ..

Где path_to_local_directory - это путь установки все библиотека, от которой вы хотите зависеть.Это будет работать для Boost, nlohmann_json, glfw3, Qt, вы называете это * (1).В моем случае это был C:/local/, а в другом - ../external/ (да, это может быть каталог, локальный для проекта!)

Давайте взглянем на мой собственный C:/local/:

ls -l /c/local/
total 12
drwxr-xr-x 1 myself 197609 0 May 26  2018 boost_1_67_0/
drwxr-xr-x 1 myself 197609 0 Sep  5 02:02 boost_1_68_0/

ПРЕДУПРЕЖДЕНИЕ : убедитесь, что ваша архитектура компилятора совпадает с установленной улучшенной версией.Или иначе cmake просто не найдет его.

Я думаю, что об этом.Следующая версия CMake (3.14) должна работать с последним бустом.


* (1) Указанная библиотека должна будет либо экспортировать свою цель CMake, либо вы должны предоставить FindXXX.cmake

0 голосов
/ 07 февраля 2019

Добавьте target_include_directories(CMakeProject2 PRIVATE .) в ваш CMakeList.txt.

.это относительный путь boost/lambda/lambda.hpp из CMakeLists.txt

И вам не следует добавлять файл .hpp в список источников.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...