Доступ к списку символов в плагине
Я использую libltdl для того, чтобы динамически загружать библиотеки плагинов. Следовал этой документации, и после того, как я позвоню
lt_dlhandle lt_dlopen (const char *filename)
Мне нужно знать, какие символы определены в этой библиотеке. Мне нужен список символов, чтобы передать его
void * lt_dlsym (lt_dlhandle handle, const char *name)
Что требует имени символа в качестве аргумента.
Как получить списки загружаемых экспортируемых символов в моем плагине?
1 ответ
Решение
Как сказал Matthieu M. в своем комментарии, нет никакого собственного способа получить список загруженных символов из динамической библиотеки.
Тем не менее, я обычно использую этот обходной путь, чтобы ваш плагин объявлял символы в контейнере, а затем извлекал этот контейнер из вашей основной программы.
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
}
Я вижу только 2 проблемы с этим решением:
- иметь неконстантную статическую переменную:
symbols
объявлено в plugin.c -> не является потокобезопасным. - иметь код, выполняемый перед main(), который трудно отладить.