Доступ к списку символов в плагине

Я использую libltdl для того, чтобы динамически загружать библиотеки плагинов. Следил за этим документация, и после того, как я позвоню

lt_dlhandle lt_dlopen (const char *filename)

Мне нужно знать, какие символы определены в этой библиотеке. Мне нужен список символов, чтобы передать его

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

Что требует имени символа в качестве аргумента.

Как получить списки загружаемых экспортируемых символов в моем плагине?

0

Решение

Как сказал 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 проблемы с этим решением:

  1. иметь неконстантную статическую переменную: symbols объявленный
    в plugin.c -> не потокобезопасен.
  2. чтобы код выполнялся до
    main (), который трудно отладить.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]