2010-01-21 3 views
3

와 라이브러리를 공유 유닉스의 상단에, 내가로드하고 다음과 같이 어느 정도 공유 라이브러리를 사용하여 :유닉스 프로그래밍 : C에서 작업 라이브러리

... 

handle = dlopen("nameOfLib"); 

... 

libInit(); 

... 

libGoToState1(); 


libGoToState2(); 


.... 

libTerminate(); 

... 

dlclose(handle); 

... 

내가하고 싶은 것은 '인정하는 내 응용 프로그램입니다 플러그인 '은 주어진 API를 준수하는 동적으로로드 할 수있는 라이브러리의 형태를 취합니다.

까다로운 부분은 내가 libInit()를 호출 한 후 플러그인을로드 할 것입니다 그리고 나는 응용 프로그램으로 라이브러리의 상태를 변경,하지만 같은 '세션'을 활용, 플러그인이 libGoToSomeOtherState()를 호출 할 수 있도록하려는 그것을 적재했다.

코딩 방법에 대한 의견을 보내 주시면 감사하겠습니다.

특히, 라이브러리 인스턴스, 주 및 모든 것을 공유하기 위해 플러그인 및 주 프로그램의 .c 파일로 이동해야하는 항목은 무엇입니까? 이것이 당신이 찾고있는 정확하게이지만, C 프로그램에 대한 간단한 플러그인을 작성하는 방법에 대한 기사가 며칠 전 레딧에 게시 된 경우

+3

관련 : http://stackoverflow.com/questions/1602398/linux-dlopen-can-a-library-be-notified-when-it-is-loaded – jldupont

+0

"-Wl, - export가 필요합니다. 동적 라이브러리 호출을 exe 자체로 되돌리려면 실행 파일을 링크 할 때 -dynamic 옵션을 사용하십시오. 그 재미있는 블로그에 –

답변

1

플러그인이 사용할 인터페이스를 내보내는 표준 방법은 인터페이스 자체를 플러그인이 링크하는 공유 라이브러리에 넣거나 그렇지 않으면 플러그인이 함수 포인터의 구조 (libInit()에 구조체)를 전달하는 것입니다 그런 다음 작업을 수행하는 데 사용됩니다.

0

간단한 힌트로 콜백을 사용하는 것이 좋습니다. 라이브러리 핸들을 플러그인에 전달하거나 플러그인 내부에서 함수 포인터를 사용하여 원래 라이브러리 함수를 호출하는 것입니다.

1

플러그인은 dlsym(RTLD_DEFAULT, "libGoToSomeOtherState")을 호출하여 호출 할 함수의 주소를 가져올 수 있으며 해당 함수 포인터를 플러그인의 init 루틴 (아마도 이러한 함수 포인터의 테이블 내)에 전달할 수 있습니다.

관련 문제