2013-09-24 2 views
1

프로젝트에 C++/Qt를 사용하고 있는데 이상한 문제가 있습니다.원격 Linux 컴퓨터에서 RTTI 확인이 실패합니다.

내 응용 프로그램은 모든 원시 Linux 컴퓨터와 Windows에서 제대로 실행됩니다. 문제는 원격 Linux 컴퓨터를 사용하여 프로그램을 실행하고 X Windows 서버 (Xming을 사용)를 보거나 사용하는 경우에 나타납니다. 디버거는 dynamic_cast가 객체 포인터를 가져 오지 못하는 라인을 가리 킵니다 (캐스트가 반환됩니다). 좋은 NULL 대신에) 내가 원하는 실제 객체 대신에.

이러한 런타임 검사를 사용하려면 일부 구성 문제가 의심 스럽습니다.

누구나 이러한 문제에 직면 해 있습니다. 해결책을 찾는 데 도움이되는 사람이 누구나있을 수 있습니다.

+0

샘플 코드가 유용 할 것입니다. –

+1

주 :'dynamic_cast <>'가 NULL을 리턴하는 것은 유효합니다. 이것은 관련이없는 포인터 유형으로 포인터를 캐스팅 할 때 발생합니다. –

+1

그러나 이것은 X와 아무 관련이 없습니다. RTTI는 최신 시스템에서 기본적으로 사용되므로 원격 시스템의 OS (및 버전)와 사용 된 컴파일러 (및 버전)를 알아야하는이 가능성을 배제하기 위해 응용 프로그램을 빌드합니다. –

답변

0

좋습니다. 많은 시도 끝에 해결책이었습니다.

나는 속성 ((가시성 ("기본"))) 를 사용하여 명시 적으로 인터페이스 클래스를 내보낼 그리고 VTABLE의 항목이 있는지 확인합니다, 이것에 대한 정의와 빈 가상 소멸자를 필요로했다.

수출하지 않으면 일부 리눅스 컴퓨터에서 보이는 것입니다. RTTI를 인식하지 못하고 NULL을 반환합니다.

0

어떻게 연결 했습니까? 우리는 우리의 Java 플러그인과 비슷한 문제를 가지고있었습니다. dynamic_cast이 개체가 생성 된 DLL과 다른 DLL에있는 경우 dlopen을 호출 할 때 을 으로 설정해야합니다. DLL 이 암시 적으로로드 된 경우 설정 여부는로드를 트리거하는 DLL에 대해 이 어떻게 설정되었는지에 따라 달라집니다 (즉, 은 제어 할 수 없음). 결국 아니요.so이 암시 적으로로드되었는지 확인해야합니다. 즉, 로더 DLL을로드하여 Java를로드하여 명시 적으로 모든 항목을로드했습니다 ( 종속성 순서).

이것은 사용자의 문제가 아닐 수 있습니다. 나는 단지 추측하고있다. 나는 충분한 정보가 없다. 그러나 정확히 같은 증상이있었습니다.

+0

원격 컴퓨터에서 로컬 컴퓨터와 달리 dll을 다르게로드한다는 의미입니다. 나는 그것이 사실인지 알아 내기 위해 몇 가지 점검을해야합니다. –

+0

그것은 그것이 들리는 것입니다. –

관련 문제