#c #cmake #yaml-cpp
Вопрос:
Я установил libyaml-cpp-dev через sudo apt install libyaml-cpp-dev
и получил версию yaml-cpp 0.5, установленную на моей машине.
dpkg -s libyaml-cpp-dev | grep Version
Version: 0.5.2-4ubuntu1
Используя это , я попытался создать тестовый код, demo.cpp как показано ниже:
#include <string>
#include "yaml-cpp/yaml.h"
int main(){
std::string config_file{"/home/freyr/exper/yamp-cpp/rvs.conf"};
YAML::Node config = YAML::LoadFile(config_file);
return 0;
}
с пирожным,
cmake_minimum_required (VERSION 2.8.11)
project (HELLO)
find_package(yaml-cpp REQUIRED)
add_executable (helloDemo demo.cpp)
include_directories(${YAML_CPP_INCLUDE_DIRS})
target_link_libraries(helloDemo ${YAML_CPP_LIBRARIES})
Когда я пытался построить , я получаю ошибку ниже:
make: Entering directory '/home/freyr/exper/yamp-cpp/build' make[1]: Entering directory '/home/freyr/exper/yamp-cpp/build' make[2]: Entering directory '/home/freyr/exper/yamp-cpp/build' Scanning dependencies of target helloDemo make[2]: Leaving directory '/home/freyr/exper/yamp-cpp/build' make[2]: Entering directory '/home/freyr/exper/yamp-cpp/build' [ 50%] Building CXX object CMakeFiles/helloDemo.dir/demo.cpp.o In file included from /usr/include/yaml-cpp/node/iterator.h:13:0,
from /usr/include/yaml-cpp/node/impl.h:11,
from /usr/include/yaml-cpp/yaml.h:17,
from /home/freyr/exper/yamp-cpp/demo.cpp:3: /usr/include/yaml-cpp/node/detail/iterator.h: In member function ‘void YAML::detail::iterator_base<V>::increment()’: /usr/include/yaml-cpp/node/detail/iterator.h:48:54: error: ‘next’ is not a member of ‘boost’ void increment() { this->base_reference() = boost::next(this->base()); }
^~~~ /usr/include/yaml-cpp/node/detail/iterator.h:48:54: note: suggested alternatives: In file included from /usr/include/c /7/bits/stl_algobase.h:66:0,
from /usr/include/c /7/bits/char_traits.h:39,
from /usr/include/c /7/ios:40,
from /usr/include/c /7/ostream:38,
from /usr/include/c /7/iostream:39,
from /home/freyr/exper/yamp-cpp/demo.cpp:1: /usr/include/c /7/bits/stl_iterator_base_funcs.h:208:5: note: ‘std::next’
next(_ForwardIterator __x, typename
^~~~ In file included from /usr/local/include/boost/mpl/next.hpp:17:0,
from /usr/local/include/boost/mpl/bind.hpp:25,
from /usr/local/include/boost/mpl/lambda.hpp:18,
from /usr/local/include/boost/mpl/apply.hpp:25,
from /usr/local/include/boost/iterator/iterator_facade.hpp:36,
from /usr/include/yaml-cpp/node/detail/node_iterator.h:12,
from /usr/include/yaml-cpp/node/detail/iterator.h:12,
from /usr/include/yaml-cpp/node/iterator.h:13,
from /usr/include/yaml-cpp/node/impl.h:11,
from /usr/include/yaml-cpp/yaml.h:17,
from /home/freyr/exper/yamp-cpp/demo.cpp:3: /usr/local/include/boost/mpl/next_prior.hpp:29:8: note: ‘boost::mpl::next’ struct next
^~~~ CMakeFiles/helloDemo.dir/build.make:62: recipe for target 'CMakeFiles/helloDemo.dir/demo.cpp.o' failed make[2]: *** [CMakeFiles/helloDemo.dir/demo.cpp.o] Error 1 make[2]: Leaving directory '/home/freyr/exper/yamp-cpp/build' CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/helloDemo.dir/all' failed make[1]: *** [CMakeFiles/helloDemo.dir/all] Error 2 make[1]: Leaving directory '/home/freyr/exper/yamp-cpp/build' Makefile:83: recipe for target 'all' failed make: *** [all] Error 2
Я вижу в последнем https://github.com/jbeder/yaml-cpp/blob/master/include/yaml-cpp/node/detail/iterator.h там нет ссылок на boost ad, все это только std c .
Как установить последнюю версию libyaml-cpp-dev, которая не имеет зависимостей от повышения ? Я не хочу создавать и устанавливать с последней версии, так как клонирование git от master каждый раз будет не очень безопасной практикой.
Ответ №1:
yaml-cpp представил зависимость boost в версии 0.5 и удалил ее в версии 0.6. Вам необходимо обновить Ubuntu до более новой версии или установить yaml-cpp из исходных текстов или установить версию yaml-cpp старше 0,5.
Смотрите: https://yaml-cpp.docsforge.com/#how-to-build
выпущен yaml-cpp 0.6.0! Для этого выпуска требуется C 11, и он больше не зависит от Boost.
См. также https://www.ubuntuupdates.org/package/core/hirsute/main/base/yaml-cpp — текущая версия yaml-cpp в Ubuntu 21.4 составляет 0.6.3-9ubuntu1
Комментарии:
1. Установка yaml-cpp из источников невозможна в некоторых установках с воздушным зазором, которые не могут клонироваться из источников yaml. Я использую Ubuntu 18.04, для которого apt получает мне libyaml-0.5, который, к сожалению, имеет зависимости от повышения. Я искал способ указать версии, с помощью которых устанавливается последний пакет. Ни одно из приложений, таких как libyaml-cpp-dev0.6 или libyaml-cpp-dev0.6.3-10, не работает.
2. Ubuntu должна иметь возможность установки (понижения до) более старых пакетов, то есть 0.4.* или более ранних.