Bug 18194

Summary: не хватает boost.system
Product: Sisyphus Reporter: Alexandre Prokoudine <alexandre.prokoudine>
Component: boost-filesystem-develAssignee: Ivan A. Melnikov <iv>
Status: CLOSED NOTABUG QA Contact: qa-sisyphus
Severity: normal    
Priority: P2 CC: iv, ldv, php-coder, sem
Version: unstable   
Hardware: all   
OS: Linux   

Description Alexandre Prokoudine 2008-12-11 21:23:56 MSK
При сборке Niepce Digital вываливается ошибка

checking for the Boost filesystem library... no
configure: error: Could not find the flags to link with Boost filesystem

при установленном пакете boost-filesystem-devel.

config.log: http://pastebin.ca/1282814

Разработчик говорит:

>hub< there is something definitely broken in your distro
 apparently you miss boost.system
 I don't know why
 try installing its devel package
 but if that is the case, file a bug to ALT Linux telling them about the missing dependency
Comment 1 Ivan A. Melnikov 2008-12-12 13:20:01 MSK
Boost.System в 1.36.0-altX является частью пакета boost-devel, от которого boost-filesystem-devel зависит, поэтому всё, что необходимо, уже должно присутсвовать в вашей системе.

В логах по ссылке заметил единственную существенную ошибку:


configure:26176: g++ -o conftest -g -O2 -DNDEBUG   -DNDEBUG -pedantic -Wall -Wcast-align -Wcast-qual -Wpointer-arith -Wreturn-type -I/usr/include  -L/usr/lib conftest.o -lboost_filesystem-mt  >&5
conftest.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:205: undefined reference to `boost::system::get_system_category()'
/usr/include/boost/system/error_code.hpp:206: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost/system/error_code.hpp:210: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost/system/error_code.hpp:211: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost/system/error_code.hpp:212: undefined reference to `boost::system::get_system_category()'
collect2: ld returned 1 exit status

это ошибка компоновщика, которая говорит, что
  * в вашей системе есть заголовочные файлы из Boost.System
  * приложению, (пусть и не напрямую) включающему их, необходимо явно компоноваться с -lboost_system-mt.

Попробуйте объяснить это configure. Могу и сам посмотреть, если дадите ссылку на исходники (с наскока не осознал, где же у них правильный svn. Я так понимаю, тарболов они пока не выкладывали?).

И ещё, Alexandre, не могли бы вы показать (для полной уверенности) вывод следующих команд:

$ rpm -qa boost-devel
$ ls /usr/lib/*boost*.so

Заранее благодарю.

Comment 2 Alexandre Prokoudine 2008-12-12 13:28:06 MSK
svn checkout http://svn.gnome.org/svn/niepce/trunk niepce

Только что переехал туда из gna.org, но роли это не играет.

Возникает подозрение, что это из-за специфических правил линковки в альте :-/ Хотя еще два месяца назад собиралось, да и до сих пор вот на машинке старая версия программы запускается.

$ rpm -qa boost-devel 
boost-devel-1.36.0-alt3

$ ls -lh /usr/lib/*boost*.so
lrwxrwxrwx 1 root root 31 Окт 20 17:15 /usr/lib/libboost_date_time-mt.so -> libboost_date_time-mt.so.1.36.0
lrwxrwxrwx 1 root root 28 Окт 20 17:15 /usr/lib/libboost_date_time.so -> libboost_date_time.so.1.36.0
lrwxrwxrwx 1 root root 32 Окт 20 17:15 /usr/lib/libboost_filesystem-mt.so -> libboost_filesystem-mt.so.1.36.0
lrwxrwxrwx 1 root root 29 Окт 20 17:15 /usr/lib/libboost_filesystem.so -> libboost_filesystem.so.1.36.0
lrwxrwxrwx 1 root root 27 Окт 20 17:15 /usr/lib/libboost_graph-mt.so -> libboost_graph-mt.so.1.36.0
lrwxrwxrwx 1 root root 24 Окт 20 17:15 /usr/lib/libboost_graph.so -> libboost_graph.so.1.36.0
lrwxrwxrwx 1 root root 31 Окт 20 17:15 /usr/lib/libboost_iostreams-mt.so -> libboost_iostreams-mt.so.1.36.0
lrwxrwxrwx 1 root root 28 Окт 20 17:15 /usr/lib/libboost_iostreams.so -> libboost_iostreams.so.1.36.0
lrwxrwxrwx 1 root root 38 Окт 20 17:15 /usr/lib/libboost_prg_exec_monitor-mt.so -> libboost_prg_exec_monitor-mt.so.1.36.0
lrwxrwxrwx 1 root root 35 Окт 20 17:15 /usr/lib/libboost_prg_exec_monitor.so -> libboost_prg_exec_monitor.so.1.36.0
lrwxrwxrwx 1 root root 27 Окт 20 17:15 /usr/lib/libboost_regex-mt.so -> libboost_regex-mt.so.1.36.0
lrwxrwxrwx 1 root root 24 Окт 20 17:15 /usr/lib/libboost_regex.so -> libboost_regex.so.1.36.0
lrwxrwxrwx 1 root root 35 Окт 20 17:15 /usr/lib/libboost_serialization-mt.so -> libboost_serialization-mt.so.1.36.0
lrwxrwxrwx 1 root root 32 Окт 20 17:15 /usr/lib/libboost_serialization.so -> libboost_serialization.so.1.36.0
lrwxrwxrwx 1 root root 29 Окт 20 17:15 /usr/lib/libboost_signals-mt.so -> libboost_signals-mt.so.1.36.0
lrwxrwxrwx 1 root root 26 Окт 20 17:15 /usr/lib/libboost_signals.so -> libboost_signals.so.1.36.0
lrwxrwxrwx 1 root root 28 Окт 20 17:15 /usr/lib/libboost_system-mt.so -> libboost_system-mt.so.1.36.0
lrwxrwxrwx 1 root root 25 Окт 20 17:15 /usr/lib/libboost_system.so -> libboost_system.so.1.36.0
lrwxrwxrwx 1 root root 28 Окт 20 17:15 /usr/lib/libboost_thread-mt.so -> libboost_thread-mt.so.1.36.0
lrwxrwxrwx 1 root root 41 Окт 20 17:15 /usr/lib/libboost_unit_test_framework-mt.so -> libboost_unit_test_framework-mt.so.1.36.0
lrwxrwxrwx 1 root root 38 Окт 20 17:15 /usr/lib/libboost_unit_test_framework.so -> libboost_unit_test_framework.so.1.36.0
lrwxrwxrwx 1 root root 26 Окт 20 17:15 /usr/lib/libboost_wave-mt.so -> libboost_wave-mt.so.1.36.0
lrwxrwxrwx 1 root root 23 Окт 20 17:15 /usr/lib/libboost_wave.so -> libboost_wave.so.1.36.0
lrwxrwxrwx 1 root root 36 Окт 20 17:15 /usr/lib/libboost_wserialization-mt.so -> libboost_wserialization-mt.so.1.36.0
lrwxrwxrwx 1 root root 33 Окт 20 17:15 /usr/lib/libboost_wserialization.so -> libboost_wserialization.so.1.36.0
Comment 3 Andrey Rahmatullin 2008-12-12 14:10:07 MSK
(In reply to comment #2)
> Возникает подозрение, что это из-за специфических правил линковки в альте :-/
Правила они такие, да. Помогают ошибки находить, которые у других не видны.
Comment 4 Ivan A. Melnikov 2008-12-12 14:25:20 MSK
Не факт, что это такая уж ошибка в апстриме. Вот минималистичный пример:

$ ls
testme.cpp
$ cat testme.cpp 

#include <boost/filesystem/path.hpp>

int main()
{
    return 0;
}

$ g++ testme.cpp -lboost_filesystem 
/home/iv/tmp/ccw8YQ4k.o: In function `__static_initialization_and_destruction_0(int, int)':
testme.cpp:(.text+0x29): undefined reference to `boost::system::get_system_category()'
testme.cpp:(.text+0x35): undefined reference to `boost::system::get_generic_category()'
testme.cpp:(.text+0x41): undefined reference to `boost::system::get_generic_category()'
testme.cpp:(.text+0x4d): undefined reference to `boost::system::get_generic_category()'
testme.cpp:(.text+0x59): undefined reference to `boost::system::get_system_category()'
collect2: ld returned 1 exit status
$ g++ testme.cpp -lboost_filesystem -lboost_system
$ ls
a.out  testme.cpp

Ну и на всякий случай:
$ ldd /usr/lib64/libboost_filesystem.so | grep system
	libboost_system.so.1.36.0 => /usr/lib64/libboost_system.so.1.36.0 (0x00007f1e97a33000)

Мне почему-то казалось, что такие зависимости должны разрешаться компоновщиком, и похоже раньше (пару месяцев назад, по словам OP) разрешались. Я чего-то недопонимаю или это проблема нового тулчейна?

2ldv@: мне кажется, здесь нужен ваш совет.


Comment 5 Dmitry V. Levin 2008-12-12 14:39:20 MSK
(In reply to comment #4)
> Не факт, что это такая уж ошибка в апстриме. Вот минималистичный пример:
> 
> $ ls
> testme.cpp
> $ cat testme.cpp 
> 
> #include <boost/filesystem/path.hpp>
> 
> int main()
> {
>     return 0;
> }
> 
> $ g++ testme.cpp -lboost_filesystem 
> /home/iv/tmp/ccw8YQ4k.o: In function `__static_initialization_and_destruction_0(int, int)':
> testme.cpp:(.text+0x29): undefined reference to `boost::system::get_system_category()'
> testme.cpp:(.text+0x35): undefined reference to `boost::system::get_generic_category()'
> testme.cpp:(.text+0x41): undefined reference to `boost::system::get_generic_category()'
> testme.cpp:(.text+0x4d): undefined reference to `boost::system::get_generic_category()'
> testme.cpp:(.text+0x59): undefined reference to `boost::system::get_system_category()'
> collect2: ld returned 1 exit status
> $ g++ testme.cpp -lboost_filesystem -lboost_system
> $ ls
> a.out  testme.cpp

Ситуация типичная: testme.o использует -lboost_system вместо -lboost_filesystem, но не линкуется с этой библиотекой; --as-needed быстро выявляет такие ошибки.

В случае необходимости частого объезда можно превратить libboost_filesystem.so в linker script наподобие libncurses.so
Comment 6 Alexandre Prokoudine 2008-12-12 15:03:17 MSK
@ldv

Это всё очень мило, но апстриму-то что говорить? :)
Comment 7 Dmitry V. Levin 2008-12-12 15:07:47 MSK
(In reply to comment #6)
> @ldv
> 
> Это всё очень мило, но апстриму-то что говорить? :)

Говорить: please adjust your test ... to link also with -lboost_system.