0

プラグイン ライブラリを動的にロードするために libltdl を使用しています。このドキュメントに従っていて、これを呼び出した後

lt_dlhandle lt_dlopen (const char *filename)

このライブラリで定義されているシンボルを知る必要があります。渡すシンボルのリストが必要です

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

引数としてシンボル名が必要です。

プラグインでロード可能なエクスポートされたシンボルのリストを取得する方法は何ですか?

4

1 に答える 1

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 つの問題しかありません。

  1. 非 const 静的変数を持つ: symbolsplugin.c で宣言 -> 非スレッドセーフ。
  2. main() の前にコードを実行するため、ほとんどデバッグできません。
于 2013-03-29T11:05:59.867 に答える