2013-09-14 2 views
1

Я хотел бы использовать (в Linux Debian Squeeze г ++ 4.4) отдельно скомпилированные подталкивания (1.54.0) библиотеки:Простой способ для соединения подталкивания библиотеки

  • Boost.Chrono
  • подталкивания. Контекст
  • Boost.Filesystem
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.Locale
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python
  • библиотекой Boost.regex
  • Boost.Serialization
  • Boost.Signals
  • Boost.System
  • Boost.Thread
  • Повышение . Тимер
  • Boost.Wave

Для того, чтобы сделать это, в соответствии с Easy Build and Install, я набрал в терминале

$ cd path/to/boost_1_54_0 
$ ./bootstrap.sh --prefix=~/boost 
$ ./b2 install 

В результате две папки include и lib были созданы в ~/boost. В ~/boost/lib есть файлы:

libboost_name.a 
libboost_name.so 
libboost_name.so.1.54.0 

для каждой библиотеки буст.

Затем я включил некоторые библиотеки (например, регулярное выражение) в моем файле test.cpp:

#include<boost/regex.hpp> //may be also chrono, filesystem or whatever 

я сказать компилятору искать регулярных выражений библиотеки в ~/импульс/Lib

$ g++ -I path/to/boost_1_54_0 test.cpp -o test -L~/boost/lib -lboost_regex 

Но это приводит к ошибке компиляции:

test.cpp:(.text+0x49): undefined reference to `boost::system::generic_category()' 
test.cpp:(.text+0x53): undefined reference to `boost::system::generic_category()' 
test.cpp:(.text+0x5d): undefined reference to `boost::system::system_category()' 
collect2: ld returned 1 exit status 

Что не так? Нет stage папка в моем ~/boost, а не как libboost_regex-gcc34-mt-d-1_36.a, указанная в Easy Build and Install. Это резонанс?

Вот содержание test.cpp

//I need a general solution/idea that works for any of these libraries 
#include <boost/regex.hpp> 
//#include <boost/chrono.hpp> 
//#include <boost/filesystem.hpp> 
//#include<boost/some-other-separately-compiled-library> 

int main() 
{ 
} 

Есть простой способ для связывания библиотек подталкивания, который работает для всех библиотек буста, которые должны быть построены отдельно?

+1

Я не вижу, как вы ссылаетесь на компоновщик. –

+0

@ VioletGiraffe, я только что редактировал вопрос – cpp

+4

Попробуйте также связать 'boost_system'. – soon

ответ

1

Что-то не так с вашей настройкой Boost. Любая конкретная библиотека в Boost должна правильно разрешаться по мере необходимости.

В системе Debian/Ubuntu, с заголовками и библиотеками в стандартных местах и ​​используя подталкивание как погружено, я могу просто вызвать g++ с одним -lfoo:

[email protected]:/tmp$ g++ -o boost_re_ex boost_regex_credit_card_ex.cpp -lboost_regex 
[email protected]:/tmp$ ./boost_re_ex 
validate_card_format("0000111122223333") returned 0 
validate_card_format("0000 1111 2222 3333") returned 1 
validate_card_format("0000-1111-2222-3333") returned 1 
validate_card_format("000-1111-2222-3333") returned 0 
machine_readable_card_number("0000111122223333") returned 0000111122223333 
machine_readable_card_number("0000 1111 2222 3333") returned 0000111122223333 
machine_readable_card_number("0000-1111-2222-3333") returned 0000111122223333 
machine_readable_card_number("000-1111-2222-3333") returned 000111122223333 
human_readable_card_number("0000111122223333") returned 0000-1111-2222-3333 
human_readable_card_number("0000 1111 2222 3333") returned 0000-1111-2222-3333 
human_readable_card_number("0000-1111-2222-3333") returned 0000-1111-2222-3333 
human_readable_card_number("000-1111-2222-3333") returned 000-1111-2222-3333 
[email protected]:/tmp$ 

Это использование the Boost 'credit card' example file прямо с сайта.

+0

Я также использую Debian. Этот пример кредитной карты компилируется для меня, но дает ошибку времени выполнения: 'boost_re_ex: /usr/include/boost_1_54_0/boost/smart_ptr/shared_ptr.hpp:646: typename boost :: detail :: sp_dereference :: type boost :: shared_ptr : : operator *() const [с T = boost :: regex_traits_wrapper >>]: Утверждение 'px! = 0 'не выполнено. Abort trap' – cpp

+0

Вы можете попробовать _packaged versions_, а не свою собственную сборку? –

+0

Вы имеете в виду установку boost через 'apt-get'? Нет, потому что мне нужно увеличить 1.54.0, а 'apt-get' работает на 1.42. – cpp

2

Невозможно дать точный ответ, потому что я не знаю, какой из boost lib зависит от этого, но вот что: с линкером по умолчанию Linux (не знаете, что он назвал, ld?), Вам нужно будьте очень осторожны с порядком, в котором вы загружаете libs в компоновщик (порядок ваших -l флагов).Сначала вы должны указать зависимую библиотеку, а затем зависимую библиотеку в указанном порядке. Так что, если ваше приложение использует библиотеку a и a зависит от b, заказ:

-la -lb,

не наоборот. В противном случае, когда линкер встречает новую библиотеку ввода, которая еще не требуется каким-либо ранее связанным кодом, она будет оптимизировать символы из этой новой «ненужной» библиотеки.

Нижняя линия - выясните порядок зависимости между вашими библиотеками boost.

+0

Попробуйте ldd на 'libboost_regex.so.1. *', Он не имеет зависимости от других библиотек Boost. –

Смежные вопросы