Bekijk de volledige versie : Про exception catching вопрос.
Выполнение тестовой программки
#include <iostream>
int main()
{
try
{
throw "Test exception";
}
catch(...)
{
std::cout<<"Exception catched"<<std::endl;
}
return(1);
}
приводит к замечательному сообщению
"terminate called after throwing an instance of 'char const*'
Aborted". Вместо ожидаемого "Exception catched".
Т.е. перехватить исключение не получается. Никак. Проблема, полагаю, где-то в недрах uClibc. Однако, встает вопрос - каким образом компилируются проекты для репозитария, тот же rtorrent, например?
Там try\catch - как на собаке блох. А пользует он тот же uClibc.
Продолжу беседу сам с собой.
Т.е. перехватить исключение не получается.
Получается, если все линковать статически.
Однако, встает вопрос - каким образом компилируются проекты для репозитария, тот же rtorrent, например?
Не нативной, а кросс-компиляцией. В этом случае все замечательно работает и при динамической линковке.
пакеты optware могут быть слинкованы как с uclibc++, так и с libstdc++ (rtorrent скомпилен именно так).
смотресть: ldd /opt/bin/rtorrent
Вообще, насколько я понимаю uclibc++ все еще в альфа состоянии и на нее особо рассчитывать не приходится. Так что если проект на с, то есть вероятность, что он будет линковаться с uclibc. Если проект на с++, то после первой неудачной попытки стоит ориентироваться на libstdc++
Если проект на с++, то после первой неудачной попытки стоит ориентироваться на libstdc++
Ну давайте проверим. Во первых, ldd от rtorrent, в котором исключения заведомо перехватываются.
libncursesw.so.5 => /opt/lib/libncursesw.so.5 (0x2ab02000)
libsigc-2.0.so.0 => /opt/lib/libsigc-2.0.so.0 (0x2aaaa000)
libcurl.so.4 => /opt/lib/libcurl.so.4 (0x2ab6a000)
libssl.so.0.9.7 => /opt/lib/libssl.so.0.9.7 (0x2abbb000)
libtorrent.so.10 => /opt/lib/libtorrent.so.10 (0x2ac02000)
libxmlrpc_server.so.3 => /opt/lib/libxmlrpc_server.so.3 (0x2aad7000)
libxmlrpc.so.3 => /opt/lib/libxmlrpc.so.3 (0x2acf6000)
libxmlrpc_util.so.3 => /opt/lib/libxmlrpc_util.so.3 (0x2aaec000)
libxml2.so.2 => /opt/lib/libxml2.so.2 (0x2ad17000)
libz.so => /opt/lib/libz.so (0x2ae93000)
libstdc++.so.6 => /opt/lib/libstdc++.so.6 (0x2aeb5000)
libm.so.0 => /opt/lib/libm.so.0 (0x2afa2000)
libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x2afc1000)
libc.so.0 => /opt/lib/libc.so.0 (0x2afe0000)
libcrypto.so.0.9.7 => /opt/lib/libcrypto.so.0.9.7 (0x2b095000)
libdl.so.0 => /opt/lib/libdl.so.0 (0x2b1e3000)
libintl.so.0 => /opt/lib/libintl.so.0 (0x2b1f6000)
ld-uClibc.so.0 => /opt/lib/ld-uClibc.so.0 (0x2aac0000)
Теперь скомпилируем программку, текст которой приведен выше. Так:
g++ -c -o test.o test.cc
g++ -o test test.o -lstdc++
При запуске программка выдает
terminate called after throwing an instance of 'char const*'
Aborted
Т.е. исключения не перехватываются.
А теперь посмотрим ldd test:
libstdc++.so.6 => /opt/lib/libstdc++.so.6 (0x2ab02000)
libm.so.0 => /opt/lib/libm.so.0 (0x2aad7000)
libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x2abef000)
libc.so.0 => /opt/lib/libc.so.0 (0x2ac0e000)
libintl.so.0 => /opt/lib/libintl.so.0 (0x2aaaa000)
ld-uClibc.so.0 => /opt/lib/ld-uClibc.so.0 (0x2aac0000)
Какие-такие библиотеки, говорите, надо использовать? :)
Более того скажу - я собирал rtorrent нативно. Список от ldd один в один, как у работающего. Но исключения не перехватываются.