Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: BGL, bjam, gcc, icc
Форум на CrossPlatform.RU > Библиотеки > boost
e.ustimenko
Всем привет. Меня зовут Евгений.

У меня возникла потребность в boost, а точнее в BGL в связи с моим дипломом.

Проблема моя состоит в следующем: не могу собрать до конца приложение. То есть, на этапе компиляции все проходит замечательно, а на этапе линковки начинает гнать какую-то фигню про то, что очень нуждается в дополнительных библиотеках.

Вот текст ошибки:

icpc -o"ShortGraphWay" ./src/searchShortWay/SearchShortWay.o ./src/main.o ./src/interface/Interface.o
./src/searchShortWay/SearchShortWay.o: In function `SearchShortWay::openGraphvizFile(std::string)':
../src/searchShortWay/SearchShortWay.cpp:(.text+0x38cf): undefined reference to `boost::detail::graph::read_graphviz(std::string const&, boost::detail::graph::mutate_graph*)'


Собираю компилятором Intel.

Погуглил основательно часа три - четыре, нашел следующие вещи:
1. Надо при сборке BGL использовать libbgl-viz. http://www.cs.brown.edu/~jwicks/boost/libs...d-graphviz.html

Собрал, как написано, проставил в опциях Eclipse. Он ее не видит

icpc -L/home/evgeny/searchshortway/lib -o"ShortGraphWay" ./src/searchShortWay/SearchShortWay.o ./src/main.o ./src/interface/Interface.o -llibbgl-viz
ld: cannot find -llibbgl-viz


2. Надо собирать не стандартными компиляторами, а специальным bjam

Тут вообще веселье началось. Поставить, поставил, а вот настроить не могу. Лезу в файлик /usr/share/boost-build/user-config.jam
Пытаюсь раскомментировать строчку с использованием gcc, он мне в ответ на команду bjam <требуемый файл> говорит, что у меня продублирован gcc. Intel я не рискнул использовать, так как не могу найти, в каком из файлом прописывается путь к компилятору.

Вот такая вот запара, манов по этому делу найти вообще не могу ни на английском, ни на русском языках.

Если сталктвались с такой проблемой, буду очень признателен за помощь.
Iron Bug
что-то у тебя каша в голове:
bjam - это НЕ КОМПИЛЯТОР. это аналог autotools, если угодно - т.е. система для автоматической сборки проектов.
bjam юзает конкретный компилятор, который ты ему укажешь. указывается он через bootstrap или непосредственно при вызове bjam для запуска компиляции boost.

чтобы детально разобраться - пиши конфиги, с которыми ты собирал буст и твои конфиги. линковщик может не найти модуль по двум причинам: неправильно задано имя, либо не совпадает битность (32 и 64). это стандартные ошибки, но может быть и что-то экзотическое, мало ли...
e.ustimenko
Цитата(Iron Bug @ 10.2.2011, 16:43) *
что-то у тебя каша в голове:
bjam - это НЕ КОМПИЛЯТОР. это аналог autotools, если угодно - т.е. система для автоматической сборки проектов.
bjam юзает конкретный компилятор, который ты ему укажешь. указывается он через bootstrap или непосредственно при вызове bjam для запуска компиляции boost.

чтобы детально разобраться - пиши конфиги, с которыми ты собирал буст и твои конфиги. линковщик может не найти модуль по двум причинам: неправильно задано имя, либо не совпадает битность (32 и 64). это стандартные ошибки, но может быть и что-то экзотическое, мало ли...


Boost ставился из репозитория, собирать я его не стал.
Iron Bug
что значит
Цитата(e.ustimenko @ 10.2.2011, 15:57) *
ставился из репозитория
?
т.е. скачан зип с бинарниками для конкретного компилятора? репозиторий - это обычно сорц.
к тому же, у тебя в заголовке темы зачем-то стоят и gcc и icc разом. и это не очень понятно: что и с чем собирается и под какую систему?
e.ustimenko
Система Ubuntu 10.10.

Сборка не имеет значения, под каким компилятором. И тот, и другой стоят, просто в разных директориях.

Инсталяция прошла методом: sudo aptitude install <набор пакетов>
DEADHUNT
Цитата(e.ustimenko @ 10.2.2011, 13:27) *
Собрал, как написано, проставил в опциях Eclipse. Он ее не видит

icpc -L/home/evgeny/searchshortway/lib -o"ShortGraphWay" ./src/searchShortWay/SearchShortWay.o ./src/main.o ./src/interface/Interface.o -llibbgl-viz
ld: cannot find -llibbgl-viz

правильно будет: -lbgl-viz, т.е. lib надо опустить.
Iron Bug
DEADHUNT правильно написал. скорее всего, ошибка в названии библиотеки.

Цитата(e.ustimenko @ 10.2.2011, 16:15) *
Сборка не имеет значения, под каким компилятором.

представь себе, имеет. и далеко не всегда разные компиляторы генерят совместимый код. а тем более с разными опциями и под разные системы.
e.ustimenko
icpc -L/home/evgeny/searchshortway/lib -o"ShortGraphWay" ./src/searchShortWay/SearchShortWay.o ./src/main.o ./src/interface/Interface.o -lbgl-viz
./src/searchShortWay/SearchShortWay.o: In function `SearchShortWay::openGraphvizFile(std::string)':
../src/searchShortWay/SearchShortWay.cpp:(.text+0x38cf): undefined reference to `boost::detail::graph::read_graphviz(std::string const&, boost::detail::graph::mutate_graph*)'


Вот код функции:

GraphvizDigraph SearchShortWay::openGraphvizFile(string path)
{
    GraphvizDigraph g_dot;
    dynamic_properties dp;

    boost::read_graphviz(path, g_dot,dp);

    return g_dot;
}
DEADHUNT
а в чём сакральный смысл использования icc для дипломной работы? скачай boost из репозитария и используй gcc, тогда проблем не возникнет.
e.ustimenko
Цитата(DEADHUNT @ 10.2.2011, 17:29) *
а в чём сакральный смысл использования icc для дипломной работы? скачай boost из репозитария и используй gcc, тогда проблем не возникнет.


Спасибо за совет, движение, конечно, есть, но вот ошибка

/usr/include/boost/graph/detail/read_graphviz_new.hpp:104: undefined reference to `boost::detail::graph::read_graphviz(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::detail::graph::mutate_graph*)'
collect2: ld returned 1 exit status
[
Iron Bug
тебе уже сказали, что разные компиляторы могут генерить НЕСОВМЕСТИМЫЙ код. и поэтому линковщик может обламываться.
чтобы они генерили совместимый код, нужно соблюдать кучу условностей и проставлять специальные ключи. а для некоторых сочетаний это в принципе невозможно.
поэтому если ты уверен, что у тебя все настройки линковки правильные, что битность совпадает и всё такое, то тут есть два варианта:
1. собрать boost с icc (это возможно, даже без всяческих патчей, ну, может, пара флажков разве что. и он работает - я дома собирала)
2. взять gcc и готовый буст под него и собирать всё с gcc.

а, ну ещё можно попробовать сделать динамическую линковку через dl, но тоже не факт, что будет работать.
e.ustimenko
Цитата(Iron Bug @ 10.2.2011, 18:13) *
тебе уже сказали, что разные компиляторы могут генерить НЕСОВМЕСТИМЫЙ код. и поэтому линковщик может обламываться.
чтобы они генерили совместимый код, нужно соблюдать кучу условностей и проставлять специальные ключи. а для некоторых сочетаний это в принципе невозможно.
поэтому если ты уверен, что у тебя все настройки линковки правильные, что битность совпадает и всё такое, то тут есть два варианта:
1. собрать boost с icc (это возможно, даже без всяческих патчей, ну, может, пара флажков разве что. и он работает - я дома собирала)
2. взять gcc и готовый буст под него и собирать всё с gcc.

а, ну ещё можно попробовать сделать динамическую линковку через dl, но тоже не факт, что будет работать.


Я собрал все с gcc, вот следующая ошибка:

/usr/include/boost/graph/detail/read_graphviz_new.hpp:104: undefined reference to `boost::detail::graph::read_graphviz(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::detail::graph::mutate_graph*)'

Вот код функции, на которую он ругается:

GraphvizDigraph SearchShortWay::openGraphvizFile(string path)
{
    GraphvizDigraph g_dot;
    dynamic_properties dp;

    boost::read_graphviz(path, g_dot,dp);

    return g_dot;
}


В библиотеках линковки не уверен. То, что написано, то и подключил. Может, что еще надо, чтобы увидело именно эту функцию и именно в таком виде.

Это и пытаюсь выяснить.
kwisp
e.ustimenko,
так ты же в эклипсе ваяешь.
пути к boost библиотекам прописаны?
кто делает Makefile?

пробывал собирать из консоли?

простенький пример, по возможности в один файл, с этой функцией накидай и попробуй собрать из консоли.

Iron Bug
так, если это уже gcc ругается, то проверяй типы.
что есть dp, какого он типа и подходит ли он к вызову данной функции?
тут уже смотри доки буста по библиотеке.
e.ustimenko
Цитата(kwisp @ 10.2.2011, 18:31) *
e.ustimenko,
так ты же в эклипсе ваяешь.
пути к boost библиотекам прописаны?
кто делает Makefile?

пробывал собирать из консоли?

простенький пример, по возможности в один файл, с этой функцией накидай и попробуй собрать из консоли.


Ругается на то же самое, уже пробовал и не раз...

Цитата(Iron Bug @ 10.2.2011, 18:40) *
Цитата(e.ustimenko @ 10.2.2011, 17:19) *
Вот код функции, на которую он ругается:

при чём тут код функции? ты видишь, что у тебя ошибка линковки, а не компиляции? а раз ты добрался до линковщика и компилятор не заругался - значит, дело не в синтаксисе и не в несоответствии типов. это именно ошибка линковщика и ошибка эта означает, что указанной функции в библиотеках и объектниках, которые ты подсунул линковщику, просто нет.


Спасибо, я это все вижу. Теперь мне нужна библиотека, где есть эта функция. По идее, как говорилось по ссылке http://www.cs.brown.edu/~jwicks/boost/libs...d-graphviz.html, я ее собрал.
Подключил, но не помогает. Поэтому ищу другие пути решения.
Iron Bug
у тебя в файле
#include <boost/graph/graphviz.hpp>
прописан?
e.ustimenko
Цитата(Iron Bug @ 10.2.2011, 18:51) *
у тебя в файле
#include <boost/graph/graphviz.hpp>
прописан?


Да, там все есть. Проверял.
Iron Bug
И ещё: проверь, что твой класс GraphvizDigraph
удовлетворяет MutableGraph Concept:
http://www.boost.org/doc/libs/1_45_0/libs/...tableGraph.html
там проверка есть - на соответствие коцепту. сначала удостоверься, что она проходит.
e.ustimenko
Нашел пример реализации, который убрал ошибку, которая у меня была, но не могу разобраться, что там что.

bool file; 
ifstream in(openfile.c_str(), ios::in);
dynamic_properties dp;
dp.property ("node_id", get(&ed_node::vertex_name, ug)); <--simple
file = read_graphviz(in, ug, dp, "node_id");


что такое здесь ed_node?
Iron Bug
Цитата(e.ustimenko @ 10.2.2011, 18:44) *
что такое здесь ed_node?

ну, очевидно, адрес некой переменной ed_node::vertex_name. обычный сишный адрес.
DEADHUNT
Цитата(Iron Bug @ 10.2.2011, 16:53) *
ну, очевидно, адрес некой переменной ed_node::vertex_name. обычный сишный адрес.

это не адрес переменной, это адрес члена класса, там выше должен стоять typedef определяющий ed_node.
Iron Bug
Цитата(DEADHUNT @ 10.2.2011, 19:14) *
это не адрес переменной, это адрес члена класса, там выше должен стоять typedef определяющий ed_node.

а какая разница? член класса - такая же переменная, как и прочие.
к тому же, это может быть вовсе не член класса(к тому же, статический, что маловероятно в бусте), а переменная в какой-то области видимости, что гораздо более вероятно.
DEADHUNT
Цитата(Iron Bug @ 10.2.2011, 16:53) *
ну, очевидно, адрес некой переменной ed_node::vertex_name. обычный сишный адрес.

загнался немного. http://www.boost.org/doc/libs/1_45_0/libs/...perty_maps.html
раньше немного писал с использованием BGL, но его код тоже странный. в документации написано первый аргумент property map, а у него почему-то указатель.
Iron Bug
dynamic_properties - это сложная шаблонная структура с multimap. и там может быть что угодно в качестве ключа.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.