2017-04-22 1 views
0

.so 파일이 있는데이 메서드를 내 C++ 코드에서 사용해야합니다. 헤더 파일이 없습니다. 필요한 심볼을 nm으로 역 컴파일하면, 메소드와 클래스 정보가 다음과 같이 발견됩니다.헤더 파일없이 .so 파일 사용

00000000002ec9c0 B CFTDOrderField::m_Describe 
0000000000067440 W CFTDOrderField::DescribeMembers() 

제 연구 후에 동적 로딩 솔루션을 사용해야한다고 생각합니다. 하지만 dlsym의 반환 유형을 정의하는 방법에 대해서는 잘 모르겠다. 아무도 내게 힌트 나 해결책을 줄 수 없을까? 고맙습니다!!

+0

dlopen/dlsym은 '정상적인'연결보다 이점이 없습니다. 또한 누락 된 헤더 파일을 대체하지 않고 재 작성해야하므로 쉽지 않습니다. 또한 저작권법에 위배 될 수도 있습니다. –

답변

-1

사소한 작업이 아닙니다. 일반적으로 여기에 dlsym을 단순히 사용할 수 없습니다. C와는 달리 C++은 심볼 이름을 망가 뜨 렸으며, mangling 표준은 구현마다 다를 수 있으며 동일한 컴파일러의 버전에 따라 다를 수 있습니다. C 규약에 따라 내 보낸 함수는 여전히 사용할 수 있지만 전체 유형 (C++ 클래스)을 사용하면 헤더 없이는 불가능합니다.

C++에서 클래스를 내보내는 공유 객체를 사용하는 것은 항상 까다로운 작업이었습니다. this 자습서와 같은 특수 함수를 사용하거나 factories과 같은 고급 기술을 사용할 수 있습니다. 마지막으로 컴파일러/링커 (모든 인기있는 현대 컴파일러가이 기능을 지원함)에 의존 할 수 있지만, 프로그램에서 사용할 것이고이 정보는 컴파일 할 때 사용할 수 있어야합니다. 이 정보는 헤더 파일에 있습니다. 따라서 귀하의 질문에 대한 답변은 오히려 부정적인 것입니다.

이름의 맹 글링과 왜 "악의"인지는 댓글의 링크를 참조하십시오. (이 기능은 문자 그대로 받아 들여서는 안되며 기술적 인 이유가 있습니다.이 기능을 통해 삶이 더 힘들어지는 경우도 있습니다 :-))

+0

안녕하세요, 저는 여러분의 말을 이해하지 못합니다. 좀 더 자세히 설명해 주시겠습니까? – user2933783

+0

죄송합니다. http://www.geeksforgeeks.org/extern-c-in-c/ 이것은 약간의 빛을 비추고 내가 무엇을 말하고 왜 C++로 작성된 공유 객체에'dlopen'을 사용하는 것이 까다로운지를 설명 할 수 있습니다. 이 도움말 (https://en.wikipedia.org/wiki/Name_mangling)에 도움이 될 수 있습니다. – rfx

관련 문제