私は2つのファイルを持っています:RollDice.cpp
#include "RollDice.h"
#include "./IPlugins.cpp"
#include "./IPluginFunctions.cpp"
#include <iostream>
RollDice::RollDice(IPluginFunctions &iPluginFunctions) :
IPlugins(iPluginFunctions) {
//srand(time(NULL));
}
RollDice::~RollDice() {
}
void RollDice::callPlugin(std::string paramsText, std::string dataText) {
std::cout << "RollDice ;)\n";
}
RollDice.h:
#ifndef ROLLDICE_H_
#define ROLLDICE_H_
#include "./IPlugins.h"
#include "./IPluginFunctions.h"
class RollDice: public IPlugins {
public:
RollDice(IPluginFunctions &iPluginFunctions);
virtual ~RollDice();
virtual void callPlugin(std::string paramsText, std::string dataText);
};
extern "C" RollDice* create(IPluginFunctions &iPluginFunctions) {
return new RollDice(iPluginFunctions);
}
extern "C" void destroy(RollDice *rollDice) {
delete rollDice;
}
#endif /* ROLLDICE_H_ */
次のコマンドで.soファイルを作成します:g ++ -shared -o RollDice.so RollDice.cpp
そして今、私のアプリケーションでこのプラグインを開きたいと思います:
this->plugin = dlopen(directory.c_str(), RTLD_LAZY);
if (!(this->plugin)) {
std::cerr << "Cannot load library: " << dlerror() << '\n';
return;
}
dlerror();
this->createPlugin = (create_p*) dlsym(plugin, "create");
const char* dlsymError = dlerror();
if (dlsymError) {
std::cerr << "Cannot load symbol create: " << dlsymError << '\n';
return;
}
this->destroyPlugin = (destroy_p*) dlsym(plugin, "destroy");
dlsymError = dlerror();
if (dlsymError) {
std::cerr << "Cannot load symbol destroy: " << dlsymError << '\n';
return;
}
しかし、メッセージが表示されます:ライブラリを読み込めません:./ RollDice.so:無効なELFヘッダー
これを解決するのを手伝ってもらえますか?
-fPIC
助けにはならない
編集:
今、私はプラグインを構築しています:
g++ -shared -fPIC -o RollDice.so RollDice.h IPlugins.cpp IPluginFunctions.cpp
そして私は新しい問題を抱えています:シンボルをロードできませんcreate:./ RollDice.so:未定義のシンボル:create
nm
RollDiceにどのシンボルがあるかを確認するために使用すると、「作成」が表示されません