2013-03-20 2 views
2

void initGui() 함수가있는 파일이 있습니다. 그것은 물건을 않습니다. 해당 파일로 만든 .so 공유 라이브러리도 있습니다.공유 라이브러리를 링크하는 동안 이상한 기호 g ++

dlsym(..., "initGui")을 시작하려고 할 때, dlerror()은 기호를 찾지 못했다는 것을 알려줍니다 (당연히 나는 그것을 열기 위해 dlopen을 사용했습니다). 그래서 nm 내 공유 라이브러리를 보았습니다. 나는 "이해"는 _Z7initGuiiii 내가 무엇을 찾고있을 수도 있습니다. 그래서 나는 dlsym에 노력했다. .. 그리고 그것은 성공했다.

누군가 내 공유 객체 라이브러리에서 깨끗한 기호를 갖는 방법을 알려주시겠습니까?

g++ -Wall -Wextra -Werror -c -fPIC으로 컴파일합니다. 일부 dlopen는 C++로 코딩 라이브러리를 공유 -ed 내부 -ing

+0

이것은 C++ 이름 맹 글링입니다. 그러나 나는 당신의 질문에 대한 답을 모른다. 좋은 질문입니다. – nalply

+1

아마도 도움이 될 것입니다. http://www.isotton.com/devel/docs/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html – nalply

답변

3

평소 연습 때 dlsym 그 탐색했습니다 기호를 (당신이 dlsym을 - 보내고있는 그 사람들은) extern "C"를 선언하는 규칙을 가지고있다. 그러면 그들의 이름은 dlsym으로 쉽게 볼 수 있습니다. 그래서 당신은 내가 당신의 C++ name mangling works, 그것은 매우 잘 정의되지 얼마나 훌륭한 세부 사항을 이해하지 않는 것이 좋습니다

typedef void initguiroutine_sig_t(void); 
initguiroutine_sig_t* initguiptr = dlsym(dlhandle,"initGui"); 
if (!initguiptr) { 
    fprintf(stderr, "initGui not found: %s\n", dlerror()); 
    exit (EXIT_FAILURE); 
}; 
// later, call initguiptr like 
(*initguiptr)(); 

을 할 다음

extern "C" void initGui(void); 

를 선언해야하고, 세부 사항의 특정 버전에 의존 C++ 라이브러리 (특히 표준 C++ 라이브러리)와 컴파일러 버전

+0

답변 해 주셔서 감사합니다. –