LINUX.ORG.RU

Boost - саморугань


0

0

Профессионалы, помогите.

Такая вот трудность: поставил буст, заголовки компилятся в проекте, всё хорошо, но когда начинаешь использовать какие-то функции - наступает коллапс: компилятор ругается на содержание hpp файлов. Так и пишет: "../iostreams/filters/zip2.hpp:307 undefined reference to `boost::iostreams::details::bzip2_base::bzip2_base(boost::iostreams::bzip2_params &const)" Короче ошибки, получается, в самих исходниках. Это под линуксом, с++, NetBeans. А под виндой на VS2005 всё замечательно собирается без ошибок


это линковщик ругается, а не компилятор

ahonimous
()

для винды в бусте сделаны прагмы для автоматической линковки нужных либ

Reset ★★★★★
()
Ответ на: комментарий от anon_666

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

mighty
() автор топика
Ответ на: комментарий от anon_666

ХА, если бы. Спасибо, Капитан.

Лично я нахожусь вот в такой ситуации: есть виртуальная машина, которая в общем-то написана на DSL на Неком Языке. Код из Некого Языка транслируется в Си, под конкретную платформу (win32/unix/mac), в конкретную директорию, и на каждой платформе собирается своими методами.

Моё поделие - расширение для виртуальной машины, так же написанное на DSL на Неком Языке. Оно, как и всё остальное, транслируется в Си, заботливо автоматизированно ложится в нужную директорию и автоматом подхватывается билд-скриптами. Почти идиллия.

Только вот расширения (в т.ч. и моё) для виртуальной машины, по крайней мере на одной платформе, собираются мейкфайлом из темплейта, единого для всех остальных расширений. Конечно, я могу взять и добавить нужные директивы линковки в этот темплейт и линковать _все_ расширения с той 3rd-party либой, которую использую, но это не по гусарски!

Вот понимал бы gcc #pragma comment (linker, «/defaultlib:...») - и проблемы бы не было.

anonymous
()
Ответ на: комментарий от mighty

Гусары вроде меня указывают, с чем и как линковаться, либо напрямую компилятору, либо через опцию в самописном мейкфайле.

Таким как ты рекомендуется залезть в опции линкера в своей уютненькой IDE и прописать нужные import libraries.

anonymous
()

Хе-хе, недавно похожим образом бился с самосборным бустом:

тема

one_more_hokum ★★★
()
Ответ на: комментарий от anon_666

>> gcc -lboost_iostreams

у меня g++ стоит как основной компилятор и как компоновщик

выдаёт при такой директиве следующую ошибку:

/usr/bin/ld: cannot find -lbost_iostreams

mighty
() автор топика
Ответ на: комментарий от mighty

только писать надо не makefile, а cmakelists.txt для cmake, чтобы было переносимо, выглядеть будет так

cmake_minimum_required(VERSION 2.8)
project(test)

set(Boost_USE_MULTITHREADED ON)
find_package(Boost 1.36.0 REQUIRED filesystem system regex thread)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

add_executable(test test.cpp)
target_link_libraries(test ${Boost_LIBRARIES})
Reset ★★★★★
()
Ответ на: комментарий от anon_666

знаю что не для меня...поэтому и задаю вопросы...

mighty
() автор топика
Ответ на: комментарий от Begemoth

Ну да, неправильно написал (есть причины, почему не могу просто скопировать :-( )

Если прописываю директиву линковщику - выдаёт следующую ошибку

/usr/bin/ld: cannot find -lboost_iostreams

Если эту директиву оставить компилятору - ошибок вообще море, в т.ч. те, которые я указывал в самом начале

mighty
() автор топика
Ответ на: комментарий от anon_666

>> Я вот прочитал как-то man gcc, пригодилось..

последую совету

Всё постепенно становится немного понятнее, но хотел бы ещё спросить в тему:

1. директива boost_iostreams - откуда она вообще взялась и если мне надо будет использовать какие-то ещё библиотеки - откуда брать названия?

2. -lboost_iostreams - позволяет подключить, если я ничего не путаю, boost::iostreams. А как будет выглядеть запись, если надо будет подключить ещё какую-нибудь директиву. pthreads например?

mighty
() автор топика
Ответ на: комментарий от mighty

> 1. директива boost_iostreams - откуда она вообще взялась и если мне надо будет использовать какие-то ещё библиотеки - откуда брать названия?

Как правило, из документации к библиотеке. У boost'a на сайте где то был список, что, как, и с чем линковать. А вообще, в случае с boost'ом можешь просто глянуть, какие *.a/*.so файлы идут с ним в комплекте - по названию сможешь легко дагадаться, что и как.

2. -lboost_iostreams - позволяет подключить, если я ничего не путаю, boost::iostreams. А как будет выглядеть запись, если надо будет подключить ещё какую-нибудь директиву. pthreads например?

Если библиотека имеет имя (имеется ввиду, имя самого файла) libsomename.so/libsomename.a, то линковщику указывается имя 'lsomename'

runtime ★★★★
()
Ответ на: комментарий от Reset

>> Как ты вообще что-то разрабатываешь, если не знаешь имена линкуемых библиотек?

да как-то всё более на ощупь. Я до этого на виде был, базами данных занимался, а тут вот пришлось. Мне только сжатие bzip нужно и как бы всё.

По правде говоря тема поста всё ещё остаётся актуальной. По-прежнему ругается сам на себя буст. Я уже даже откуда-то взял эти дурацкие библиотеки *.a/*.so, правда предыдущей версии буста (кстати, это повод чтобы завалиться?). Теперь линковщик директивы принимает, а вот компилиться код всё равно не хочет. Переустановил буст - ::iostreams вообще не создались. Я уже вторые сутки бьюсь с этой хренью и пока хрень побеждает. Буду благодарен за любой совет как с этим справмиться

mighty
() автор топика
Ответ на: комментарий от mighty

Ты творишь неведомую %уйню, вот и результат. Не надо ничего нигде искать и ставить непойми чего, надо поставить буст из репозитория твоего дистрибутива.

Reset ★★★★★
()
Ответ на: комментарий от Reset

>> Ты творишь неведомую %уйню, вот и результат.

Отрицать не стану. Я и сам так считаю :-) У меня на компе стоит центос 5.3, на компе только HTTP интернет (то есть yum install... не прокатят). После установки не было даже компилятора - всё пришлось ставить с боями отдельно. Так что я бы и рад сделать как попроще, но вот не знаю как :-( попробую поставить, хотя там версия 1.33 только...но может пойдёт. Тему пока не закрываю, мало ли опять всё как всегда пойдёт через жопу. Я это умею :-)

mighty
() автор топика
Ответ на: комментарий от mighty

Ну да, как и предполагалось - ничего не получилось.

Я установил из репозитория буст 1.33. Библиотеки *.а и *.so появились, пути к ним прописал, но по-прежнему буст ругается на свои собственные файлы. "../iostreams/filters/zip2.hpp:307 undefined reference to `boost::iostreams::details::bzip2_base::bzip2_base(boost::iostreams::bzip2_params &const)"

Это при том, что директиву линковщику -lboost_iostreams я добавил.

Может быть будут ещё рекомендации (убицца об стену не предлагать, я уже сам об этом подумываю).

mighty
() автор топика
Ответ на: комментарий от mighty

свойства проекта - Build/Linker, Libraries,Add Library File, тыкаешь в то, что хочешь линковать, ок

http://piccy.info/view3/384511/2e733525461dd7ddf0a6a312f6a9720c/orig/

если не помогает - копипастишь сюда весь вывод линковщика + саму команду линковки( будет вместе с выводом )

ahonimous
()
Ответ на: комментарий от mighty

Полную ошибку приведи. Почему на zip2.hpp относительный путь указан? Ты точно подключаешь дистрибутивный буст ?

Reset ★★★★★
()
Ответ на: комментарий от mighty

>и если мне надо будет использовать какие-то ещё библиотеки - откуда брать названия

Ещё для этого есть pkg-config.

anon_666
()
Ответ на: комментарий от ahonimous

>>свойства проекта - Build/Linker, Libraries,Add Library Fil

у меня такой возможности вообще нет :-(

привожу вывод

«/usr/bin/gmake» -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf gmake[1]: Entering directory `/root/MyPrj/server' «/usr/bin/gmake» -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/server gmake[2]: Entering directory `/root/MyPrj/server' mkdir -p dist/Debug/GNU-Linux-x86 g++ -lpthread -lboost_iostreams -o dist/Debug/GNU-Linux-x86/server build/Debug/GNU-Linux-x86/main.o build/Debug/GNU-Linux-x86/support.o build/Debug/GNU-Linux-x86/Nodes.o build/Debug/GNU-Linux-x86/implementation.o build/Debug/GNU-Linux-x86/bzip2compressor.o -L/usr/local/lib -L/usr/local/include/boost -Wl,-rpath /usr/local/lib -Wl,-rpath /usr/local/include/boost build/Debug/GNU-Linux-x86/bzip2compressor.o: In function `bzip2_compressor_impl': /usr/local/include/boost/iostreams/filter/bzip2.hpp:307: undefined reference to `boost::iostreams::detail::bzip2_base::bzip2_base(boost::iostreams::bzip2_params const&)' build/Debug/GNU-Linux-x86/bzip2compressor.o: In function `~bzip2_compressor_impl': /usr/local/include/boost/iostreams/filter/bzip2.hpp:196: undefined reference to `boost::iostreams::detail::bzip2_base::~bzip2_base()' build/Debug/GNU-Linux-x86/bzip2compressor.o: In function `void boost::iostreams::detail::bzip2_base::init<std::allocator<char> >(bool, boost::iostreams::detail::bzip2_allocator<std::allocator<char>, boost::iostreams::detail::bzip2_allocator_traits<std::allocator<char> >::type>&)': /usr/local/include/boost/iostreams/filter/bzip2.hpp:159: undefined reference to `boost::iostreams::detail::bzip2_base::do_init(bool, void* (*)(void*, int, int), void (*)(void*, void*), void*)' build/Debug/GNU-Linux-x86/bzip2compressor.o: In function `boost::iostreams::detail::bzip2_compressor_impl<std::allocator<char> >::filter(char const*&, char const*, char*&, char*, bool)': /usr/local/include/boost/iostreams/filter/bzip2.hpp:315: undefined reference to `boost::iostreams::detail::bzip2_base::before(char const*&, char const*, char*&, char*)' /usr/local/include/boost/iostreams/filter/bzip2.hpp:316: undefined reference to `boost::iostreams::bzip2::finish' /usr/local/include/boost/iostreams/filter/bzip2.hpp:316: undefined reference to `boost::iostreams::bzip2::run' /usr/local/include/boost/iostreams/filter/bzip2.hpp:316: undefined reference to `boost::iostreams::detail::bzip2_base::compress(int)' /usr/local/include/boost/iostreams/filter/bzip2.hpp:317: undefined reference to `boost::iostreams::detail::bzip2_base::after(char const*&, char*&)' /usr/local/include/boost/iostreams/filter/bzip2.hpp:318: undefined reference to `boost::iostreams::bzip2_error::check(int)' /usr/local/include/boost/iostreams/filter/bzip2.hpp:319: undefined reference to `boost::iostreams::bzip2::stream_end' build/Debug/GNU-Linux-x86/bzip2compressor.o: In function `boost::iostreams::detail::bzip2_compressor_impl<std::allocator<char> >::close()': /usr/local/include/boost/iostreams/filter/bzip2.hpp:325: undefined reference to `boost::iostreams::detail::bzip2_base::end(bool)' collect2: выполнение ld завершилось с кодом возврата 1 gmake[2]: *** [dist/Debug/GNU-Linux-x86/server] Ошибка 1 gmake[1]: *** [.build-conf] Ошибка 2 gmake: *** [.build-impl] Ошибка 2 gmake[2]: Leaving directory `/root/MyPrj/server' gmake[1]: Leaving directory `/root/MyPrj/server'

ПОСТРОИТЬ FAILED (значение выхода 2, общее время: 3S)

mighty
() автор топика
Ответ на: комментарий от Reset

>>Полную ошибку приведи. Почему на zip2.hpp относительный путь указан? Ты точно подsключаешь дистрибутивный буст ?

Подклюючаю буст бесспорно.Все файлы находятся как надо? библиотеки я прописал - на директиву -lboost_iostreams больше не ругается, но и не собирается...Ошибку привёл в прошлом сообщении, к сожалению форматирование сбилось. Относительный путь указан потому, что так его задала IDE.

mighty
() автор топика
Ответ на: комментарий от Reset

>>если у тебя родной дистрибутивный буст, то почему оно что-то тянет из /usr/local ?

Стоп, минутку. У меня на диске, действительно, был rpm. Я его запустил и он установился в /usr/local. Откуда он должен тогда тянуть?

mighty
() автор топика
Ответ на: комментарий от mighty

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

Reset ★★★★★
()
Ответ на: комментарий от Reset

>>rpm'ы в /url/local не ставятся

Я когда устанавливал bjam -ом буст - он тоже туда туда слил все файлы. И как мне лучше разрулить вопрос с бустом? С чего начать вообще?

mighty
() автор топика
Ответ на: комментарий от mighty

удали буст из /usr/local, оставь только то, что поставилось из rpm

Reset ★★★★★
()
Ответ на: комментарий от anon_666

>>/usr/local/lib имеет приоритет перед /usr/lib.

Так у меня, собственно, никакой бустовских файлов в /usr/lib нет

mighty
() автор топика
Ответ на: комментарий от mighty

еще есть варианты - собрать динамический буст или дописать -lboost_iostream в конец и убрать из начала

Reset ★★★★★
()
Ответ на: комментарий от mighty

А должны быть, ибо centos'овская официальная rpm'ка кладет либы туда. yum install boost-devel должен тебе все сделать

Reset ★★★★★
()
Ответ на: комментарий от Reset

Всё, заработало : переставил буст из репозитория, проследил, чтобы он встал куда нужно и всё заработало.

Всем большое спасибо! Без ваших квалифицированных советов в моей стене для ударов головой появилось бы очередное отверстие :-)

mighty
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.