2012-01-18 3 views
2

내 문제는 다음C++ 예외

자주 반복되는 작업의 래퍼 같은 ICE (인터넷 통신 엔진) 뭔가를 기반으로 Interface.so라는 공유 라이브러리가있다. 이러한 작업 중 하나는 주제 (id와 유사)에 등록하는 것입니다. 이 주제가 이미 존재하지 않는 경우, ICE는 NoSuchTopic이라는 예외를 throw합니다.

독립 실행 형 Qt 응용 프로그램에서 Interface.so를 사용하는 경우 NoSuchTopic 예외를 catch하고 catch 블록에 주제를 만들 수 있습니다 (catch 블록은 Interface.so에 있습니다). 하지만 나는 그 자체를 공유 객체 인 비행 시뮬레이터 용 플러그인에서 동일하게하고 싶습니다. 그리고 예외는 앞에서 언급 한 Interface.so의 catch 블록에 의해 발견되지 않습니다. 대신, 비행 시뮬레이터는

terminate called after throwing an instance of 'IceStorm::NoSuchTopic' 

나노 -C -D는 'IceStorm :: NoSuchTopic가'Interface.so에 정의되어 있지 않습니다 있다고 주장 충돌합니다. 이거 괜찮아? 또는 정의를 찾을 수있는 참조가 있어야합니까? 이미 libIceStorm.so (libs + = -lIceStorm)에 IceStorm :: NoSuchTopic (nm에 따라)이 정의되어 있지만 아무것도 변경하지 않은 항목이 추가되었습니다!

또한 '-Wl, -E'도 시도했지만 Qt Creator에서이 옵션을 올바르게 설정했는지 여부는 알 수 없습니다. 이게 도움이 되겠습니까?

나는 모든 힌트에 감사 할 것입니다.

답변

1

전에이 문제가 발생하기 전에 일반적으로 사용할 수없는 유형 정보 때문입니다.

try {} catch (...) {} 블록으로 예외를 잡을 수 있습니다. 정보 유형이 누락 되어도 예외를 catch하지만 특히 유용하지는 않습니다!

공유 라이브러리에 기호가 숨겨져있는 경우 종종 문제가 될 수 있습니다. GCC Visibility 문서, 특히 "C++ 예외 문제 (읽어보십시오!)"절을 참조하십시오.

This question은 여분의 플래그를 사용하도록 권장합니다.

경우에 따라 라이브러리의 이전 버전에 대해 무언가가 빌드 된 경우 클린 재 작성으로 문제를 해결할 수 있습니다. 클린 재 빌드로 문제가 해결되면 빌드 스크립트가 올바른지 확인하십시오.

+0

답변 해 주셔서 감사합니다. 불행히도 나는 여기에 게시하기 전에 모든 제안을 시도했다. (내 "-Wl, -E"는 링크 된 응답에서 나온 것이다.) 그러나 마침내 동료가 문제를 해결했습니다. Ubuntu 저장소에서 ICE에 사용 된 GCC 버전은 Ubuntu 11.10 Default GCC와 다르므로 ICE 소스에서 다시 컴파일하여 문제를 해결했습니다. – Markus

0

이전 버전과 같은 사운드는 소스에서 빌드 할 때 "예외 없음"플래그를 사용했습니다. 그것은 많은 사람들이 그것을 떠날 수 있도록 많은 시간을 빌드에 추가합니다.