Проблемы с чтением из графвиза в boost - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь прочитать в следующем графике, используя boostv graphviz:

graph G {
0[label="1"];
1[label="0"];
2[label="1"];
3[label="1"];
0--1 [label="1.2857"];
1--2 [label="4.86712"];
1--3 [label="2.29344"];
}

Однако, каждый раз, когда я пытаюсь его скомпилировать, я получаю неприятную ошибку:

/tmp/ccnZnPad.o: In function "bool boost::read_graphviz_new<boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, Vertex, Edge, boost::no_property, boost::listS> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, Vertex, Edge, boost::no_property, boost::listS>&, boost::dynamic_properties&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):test.cpp(.text._ZN5boost17read_graphviz_newINS_14adjacency_listINS_4vecSES2_NS_11undirectedSE6Vertex4EdgeNS_11no_propertyENS_5listSEEEEEbRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERT_RNS_18dynamic_propertiesESG_[_ZN5boost17read_graphviz_newINS_14adjacency_listINS_4vecSES2_NS_11undirectedSE6Vertex4EdgeNS_11no_propertyENS_5listSEEEEEbRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERT_RNS_18dynamic_propertiesESG_]+0x98): undefined reference to boost::detail::graph::read_graphviz_new(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::detail::graph::mutate_graph*)' collect2: error: ld returned 1 exit status

Я понятия не имею, что это значит, я попытался скомпилировать с g++ -lboost_graph test.cpp и все еще получаю ошибку. Я также попытался включить <libs/graph/src/read_graphviz_new.cpp>, но моя программа не работает, потому что он не знает, что такое <libs/graph/src/read_graphviz_new.cpp>. Я не знаю, что мне нужно попробовать дальше, или, может быть, это не правильный способ распечатать это. Любая помощь будет принята с благодарностью!

#include <fstream>

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/property_map/dynamic_property_map.hpp>
//#include <libs/graph/src/read_graphviz_new.cpp> //breaks if I try to include
#include <boost/graph/graph_utility.hpp>

struct Vertex 
{
  bool isLeaf;
};

struct Edge
{
  double weight;
};

typedef boost::adjacency_list<boost::vecS,boost::vecS, boost::undirectedS, Vertex, Edge> Graph;

int main()
{
    Graph g;
    boost::dynamic_properties dp;
    dp.property("label", get(&Vertex::isLeaf, g));
    dp.property("label", get(&Edge::weight, g));

    std::ifstream dot("baseTree.dot");

    boost::read_graphviz(dot,g,dp);
    write_graphviz_dp(std::cout, g, dp); 
}

Ответы [ 2 ]

0 голосов
/ 21 августа 2018

Дополнение, особенно для пользователей Win / MSVC: в заголовках boost :: graph нет файла config.h, поэтому автоматическое связывание для этой библиотеки не реализовано (причина указана на самой первой странице документа BGL по адресу boost.org: речь идет о чистой библиотеке заголовков, кроме стороннего формата, поддерживающего функции экспорта / импорта, в том числе grapViz).

Итак, libbost-graph-*.lib в соответствующей версии следует связать вручную. Но эта библиотека в свою очередь имеет зависимость от boost-regex-*.lib. У этого есть автоматическое связывание, поэтому достаточно поместить #include <boost/regex.hpp> в любом месте вашего кода, даже если нет фактического использования регулярных выражений. Эта гарантия, что соответствующая версия boost-regex-*.lib будет выбрана автоматически.

0 голосов
/ 11 мая 2018

Реализация read_graphviz находится в библиотечной части (скомпилирована), поэтому вам нужно каким-то образом связать ее.

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

#include <libs/graph/src/read_graphviz_new.cpp>

"Каноническим" способом является компиляция библиотеки и ссылки, например, с помощью

g++ test.cpp -lboost_graph 

И да, порядок имеет значение!( Почему порядок опции -l в gcc имеет значение? )

...