2011-04-13 3 views
1

인사말.해결되지 않은 기호를 해결하는 방법은 무엇입니까?

동적으로 내 프로그램을 내 라이브러리에 연결하는 데 문제가 있습니다. 다음과 같은 현상이 있습니다. 모듈 형 프로그램을 개발하고 모듈 시스템을 테스트하고 있습니다. 문제는 내 모듈이 메인 바이너리에 정의 된 몇 가지 클래스를 사용한다는 것입니다 : 어떤 이슈를 발생시키지 않는 추상 클래스와 해결할 수없는 매우 구체적인 클래스.

저는 dlopen/dlsym/dlclose 함수를 사용하고 있습니다. 그리고 g ++를 사용하여 컴파일합니다.

것은입니다 : 다음은 나에게 "undefined symbol: _ZNK3zia3api8DataTreecvRKSsEv 를 말하는 실패하지만 게으른 모드에서 dlopen을 시작하는 경우에만 소위 클래스의 첫 번째 사용에서 발생 (것이며, 모든 기호를로드 할 수 dlopen을 요구하는 경우 그 직후에 충돌).

그래서 "DataTree"클래스이며 기본 바이너리와 모듈 모두에서 사용할 수 있도록하려고합니다. 이미 각 바이너리에서 컴파일하려고했습니다. 예상대로 작동하지 않았습니다. 전적으로 인라인으로 만들려고했지만 다른 시도만큼 쓸모가 없습니다. "-rdynamic"옵션을 사용하여 주 바이너리를 컴파일하려고했습니다. 변경 사항 없음.

저는 어제부터 친구에게 질문했지만 아무도 이런 종류의 문제를 해결하는 방법을 알 수없는 것 같습니다.

g++ -Wall -fPIC -c mysource.cpp 

을 그리고 나는 도서관하려면이 줄을 사용하십시오 :

나는 다음과 같은 옵션 -fPIC과 모듈의 객체를 컴파일

g++ -shared -Wl,-soname,mylib.so.1 -o mylib.so mysource.o 

내가 최고의 솔루션을 가정을 라이브러리 내에서 오브젝트를 컴파일하지 않고 메인 바이너리에서 심볼을 사용할 수 있도록하는 것입니다. 그래서 질문은 : 어떻게 그렇게합니까? (그리고 내가해야하는 것입니까?)

+1

demangled 이름은 zia :: api :: DataTree :: operator std :: string const & (const) –

+1

입니다.'C++ filt' 유틸리티를 사용하여 (리눅스에서) demangled 이름을 얻을 수 있습니다. 호출은 단지'C++ filt _ZNK3zia3api8DataTreecvRKSsEv'이며 결과는 @Industrial이 게시 한 것입니다. 매우 편리! –

+0

좋은 주인! 이것은 실제로 정의되지 않았습니다! 나는 그것을 알아 차리지 못했다! 고마워요! – Michael

답변

0

주 프로그램이 아닌 라이브러리 모듈에 -rdynamic을 추가하고 가상 메소드가 있고 상속 된 모든 클래스에 가상 소멸자가 있는지 확인하십시오. 또 다른 제안 : 최소한의 예를 만들고 여기에 게시하십시오.

+0

그것을 일으키는 클래스에는 소멸자를 제외하고는 가상 메서드가 없습니다. 나는 또한 doble-checked : 나는 이미 -rdynamic을 사용하고 있으며, 현재 메인 바이너리와 라이브러리 (juste in case)에서 그것을하고있다. 여전히 변경 사항 없음 : /! – Michael

관련 문제