2010-03-11 26 views
6

Projem, paylaşılan kütüphane ve exe istemcisi içerir. Kütüphaneden atılan kendi istisna sınıfımın istemci yakalama bloğu tarafından yakalanmadığını ve programın "bir örnek attığından sonra sonlandırıldı ..." mesajıyla sonlandığını buldum. Proje ile oynamaya devam ettim, herhangi bir türden herhangi bir istisnanın yakalanmadığını tespit ettim. Örneğin, bu yakalama çalışmaz:GCC programında istisnalar yakalanmaz

 
    try 
    { 
     m_pSerialPort = new boost::asio::serial_port(m_IoService, "non-existing-port"); 
    } 
    catch(const boost::system::system_error& e) 
    { 
     // ... 
    } 

Hata mesajı:

 
terminate called after throwing an instance of 
'boost::exception_detail::clone_impl 
<boost::exception_detail::error_info_injector 
<boost::system::system_error> >' 
    what(): No such file or directory 

GCC sürüm 4.4.1, Linux işletim sistemidir. Aynı kod Windows, MSVC'de başarıyla çalışıyor. GCC programının istisnaları düzgün şekilde yakalamasını nasıl engelleyebilir?

+0

Makefile'ı yayınlayabilir misiniz, böylece hangi argümanların gcc'ye geçtiğini görebiliriz? İstisnaları devre dışı bırakan argümanları iletebilirsiniz. –

+0

Ek bilgi: Bu kodu eklediğimde: {throw 1;} catch (int) {} istemcisini çalıştırılabilir duruma getirin, her şey yolunda. Ancak, paylaşılan kitaplıktaki aynı kod şunları verir: 'int' örneğinin atılmasıyla çağrılan sonlandırma –

+0

Göze Çarpan Derleyici: teknik soru. Makefile'yi buradan nasıl gönderebilirim? Yorum uzunluğu kısıtlıdır ve herhangi bir biçimlendirmeye izin vermez. –

cevap

8

Paylaşılan kitaplık sınırlarını aşmak için istemci .exe ve paylaşılan kitaplığın her ikisi de libgcc ile bağlanmalıdır.

... Bir kütüphane ya da ana yürütülebilir istisnalar atmak veya yakalamak gerekiyordu, sen programda kullanılan diller için uygun olarak, bu G ++ veya GCJ sürücüsünü kullanarak bağlamak ya gerekir: GCC kılavuzda Başına -shared-libgcc seçeneğini kullanarak, paylaşılan libgcc ile bağlantı kuracaktır.

+0

Sadece bu yeri GCC el kitabında okumak :) Üçüncü taraf kütüphanelerini statik olarak bağlamaya çalışıyorum, bu sorunu daha iyi öğrenmem gerekiyor gibi görünüyor. Program şimdi çalışıyor, teşekkürler. –

+0

Üçüncü taraf kitaplıklarına statik olarak bağlanabilirsiniz, üçüncü taraf kitaplıklarının dinamik olarak libgcc'e bağlandığından emin olun. Böylece işleminizde sadece bir libgcc örneğiniz olacak. – karunski