我正在使用 libltdl 来动态加载插件库。一直在关注这个文档,在我打电话给这个之后
lt_dlhandle lt_dlopen (const char *filename)
我需要知道这个库中定义了哪些符号。我需要将符号列表传递给
void * lt_dlsym (lt_dlhandle handle, const char *name)
这需要一个符号名称作为参数。
在我的插件中获取可加载导出符号列表的方法是什么?
我正在使用 libltdl 来动态加载插件库。一直在关注这个文档,在我打电话给这个之后
lt_dlhandle lt_dlopen (const char *filename)
我需要知道这个库中定义了哪些符号。我需要将符号列表传递给
void * lt_dlsym (lt_dlhandle handle, const char *name)
这需要一个符号名称作为参数。
在我的插件中获取可加载导出符号列表的方法是什么?
就像 Matthieu M. 在他的评论中所说的那样,没有本地方法可以从动态库中获取已加载符号的列表。
但是,我通常使用这种解决方法,即让您的插件在容器中声明符号,然后从您的主程序中检索此容器。
插件.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);
插件.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 -> 非线程安全中声明。