인사말.해결되지 않은 기호를 해결하는 방법은 무엇입니까?
동적으로 내 프로그램을 내 라이브러리에 연결하는 데 문제가 있습니다. 다음과 같은 현상이 있습니다. 모듈 형 프로그램을 개발하고 모듈 시스템을 테스트하고 있습니다. 문제는 내 모듈이 메인 바이너리에 정의 된 몇 가지 클래스를 사용한다는 것입니다 : 어떤 이슈를 발생시키지 않는 추상 클래스와 해결할 수없는 매우 구체적인 클래스.
저는 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
내가 최고의 솔루션을 가정을 라이브러리 내에서 오브젝트를 컴파일하지 않고 메인 바이너리에서 심볼을 사용할 수 있도록하는 것입니다. 그래서 질문은 : 어떻게 그렇게합니까? (그리고 내가해야하는 것입니까?)
demangled 이름은 zia :: api :: DataTree :: operator std :: string const & (const) –
입니다.'C++ filt' 유틸리티를 사용하여 (리눅스에서) demangled 이름을 얻을 수 있습니다. 호출은 단지'C++ filt _ZNK3zia3api8DataTreecvRKSsEv'이며 결과는 @Industrial이 게시 한 것입니다. 매우 편리! –
좋은 주인! 이것은 실제로 정의되지 않았습니다! 나는 그것을 알아 차리지 못했다! 고마워요! – Michael