2013-03-29 13 views
0

플러그인 라이브러리를 동적으로로드하기 위해 libltdl을 사용하고 있습니다. 이 documentation 다음, 나는이플러그인 기호 목록 액세스

lt_dlhandle lt_dlopen (const char *filename) 

를 호출 한 후 나는 기호는이 라이브러리에 정의되어있는 것을 알 필요가 있었다. 그것을 전달할 기호 목록이 필요합니다.

void * lt_dlsym (lt_dlhandle handle, const char *name) 

기호 이름을 인수로 사용해야하는 경우.

내 플러그인에서로드 가능한 내 보낸 기호 목록을 가져 오는 방법은 무엇입니까?

+1

일반적으로로드 할 심볼의 이름은 사전 동의됩니다. 뿐만 아니라 그것의 유형. 예를 들어,'foo'라는 플러그인의 경우'setup_foo','teardown_foo' 및'go_foo' 함수가있을 것으로 예상됩니다. –

답변

1

Matthieu M.이 그의 의견에서 말한 것처럼 동적 인 lib에서로드 된 심볼 목록을 가져 오는 기본 방법은 없습니다.

그러나 일반적으로이 해결 방법은 플러그인에서 기호를 컨테이너에 선언 한 다음 주 프로그램에서이 컨테이너를 검색하는 것입니다.

plugin.h

#include <set> 
#include <string> 

// call this method from your main program to get list of symbols: 
const std::set<std::string> & getSymbols(); 

void MySymbol01(); 
bool MySymbol02(int arg1, char arg2); 

plugin.c

#include "plugin.h" 

class SymbolDeclarator { 
    public: 
    static std::set<std::string> symbols; 
    SymbolDeclarator(const std::string & symbol) { 
     symbols.insert(symbol); 
    } 
}; 

const std::set<std::string> & getSymbols() { 
    return SymbolDeclarator::symbols; 
} 

#define SYMBOL(RETURN, NAME) \ 
    static const SymbolDeclarator Declarator##NAME(#NAME); \ 
    RETURN NAME 

SYMBOL(void, MySymbol01)() { 
    // write your code here 
} 

SYMBOL(bool, MySymbol02)(int arg1, char arg2) { 
    // write your code here 
} 

I는이 솔루션이 문제를 참조하십시오

  1. 는 const가 아닌 정적을 가지고 변수 : symbols은로 선언되었습니다. plugin.c에서-> 스레드로부터 안전하지 않습니다.
  2. 디버그가 거의 불가능한 main() 전에 실행되는 코드가 있어야합니다.