2010-03-11 4 views
6

내 프로젝트에 공유 라이브러리와 exe 클라이언트가 있습니다. 라이브러리에서 던져진 내 자신의 예외 클래스가 클라이언트 catch 블록에 의해 catch되지 않고 프로그램이 "...의 인스턴스를 throw 한 후 호출 종료"메시지로 종료됨을 발견했습니다. 프로젝트를 계속 진행하면서 어떤 유형의 예외도 발견되지 않는 것으로 나타났습니다. 예를 들어,이 캐치가 작동하지 않습니다GCC 프로그램에서 예외가 발견되지 않습니다.

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

오류 메시지 :

 
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 버전은 4.4.1, 리눅스 OS입니다. 동일한 코드가 Windows에서 성공적으로 실행되고 있습니다 (MSVC). GCC 프로그램이 예외를 제대로 잡을 수없는 이유는 무엇입니까?

+0

gcc로 전달되는 인수를 볼 수 있도록 Makefile을 게시 할 수 있습니까? 예외를 비활성화하는 인수를 전달할 수 있습니다. –

+0

추가 정보 :이 코드를 추가하면 : {throw 1;} catch (int) {}를 클라이언트 실행 파일에 적용하면 모든 것이 정상입니다. 그러나 공유 라이브러리의 동일한 코드는 다음을 제공합니다. 'int'인스턴스를 throw 한 후 호출 종료. –

+0

현저한 컴파일러 : 기술적 인 문제. Makefile을 여기에 게시하려면 어떻게해야합니까? 설명은 길이에 의해 제한되며 형식을 사용할 수 없습니다. –

답변

8

클라이언트 .exe와 공유 라이브러리는 모두 공유 라이브러리 경계를 벗어나기 위해 libgcc와 연결되어야합니다.

... 도서관이나 주요 실행 파일이 예외를 던지거나 잡을 것으로 예상되는 경우,이 프로그램에서 사용되는 언어에 적절한는 G ++ 또는 GCJ 드라이버를 사용하여 연결, 또는해야 GCC의 설명서 당 옵션 -shared-libgcc를 사용하여 공유 libgcc와 링크됩니다.

+0

GCC 설명서에서이 위치를 읽는 것만으로 :) 제 3 자 라이브러리를 정적으로 연결하려고합니다.이 문제를 더 잘 배워야 할 것 같습니다. 프로그램이 지금 작동 중입니다. 감사합니다. –

+0

타사 라이브러리를 정적으로 링크 할 수 있습니다. 타사 라이브러리가 libgcc에 동적으로 링크되어 있는지 확인하십시오. 따라서 프로세스에 libgcc 인스턴스가 하나만 있습니다. – karunski

관련 문제