Загрузка файлов с помощью dlsym, загрузка библиотеки невозможна

Я реализую API, который загружает плагины из .so файлов. Для их загрузки я использую функцию dlsym (). Чтобы проверить, работает ли он, я реализовал тестовый плагин (ниже) и, чтобы упростить задачу, я загружаю только функцию «инициализации». Чтобы скомпилировать мой код, я сначала создаю файл .so с помощью следующей команды:

      g++ -Wall -shared -rdynamic -fPIC plugin_test.cpp -o plugin_test.so

После этого я запускаю plugin_manager.cpp следующим образом:

      g++ plugin_manager.cpp -o -plugin_manager.o -ldl

Но после запуска a.out и ввода правильного имени файла я получаю сообщение об ошибке, что не могу загрузить файл .so. Кто-нибудь имеет представление о том, как решить эту проблему?

plugin_manager.cpp

      #include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include "plugin_interface.h"using namespace std;
//typedef void (*test_function)(void);

int main(void) {
const char *error;
void *module;
//test_function initialize_test;
//void (*initialize_test) (void);
//test_function analyze_test;
//test_function finalize_test;
//load the DL library
string filename;
cout << "File :: " << endl;
cin >> filename;
module = dlopen(filename.c_str(), RTLD_LAZY);
if (!module) {
fprintf(stderr, "ERROR! Couldn't load library: %s\n",
dlerror());
exit(1);
}

//get and check symbol
dlerror();
initialize_f* initialize_function = (initialize_f*) dlsym(module, "initialize");
if ((error = dlerror())) {
fprintf(stderr, "ERROR %s\n", error);
exit(1);
}

//create instance of the class
PluginInterface* plugin = initialize_function();

//use the class
plugin->initialize();
//call "initialize" function from the test plug-in
//(*initialize_test)();

dlclose(module); //close the DL library
return 0;
}

plugin_interface.h

    #ifndef PLUGIN_INTERFACE_H_INCLUDED
#define PLUGIN_INTERFACE_H_INCLUDED

class PluginInterface{

public:
virtual void initialize() = 0;
virtual void analyze() = 0;
virtual void finalize() = 0;
};

//Definition of the pointer
typedef PluginInterface* initialize_f();
#endif // PLUGIN_INTERFACE_H_INCLUDED

test_plugin.cpp

         #include <iostream>
#include "plugin_interface.h"using namespace std;

class bbb :public PluginInterface {
public:

virtual void initialize(){
cout << "Initialization";
}

void analyze(){
cout << "Analysis";
}
void finalize(){
cout << "Finalization";
}

};

//The functions we load must be qualified as extern "C" to avoid the symbol name being mangled
extern "C" PluginInterface* initialize(){
return new bbb();
}
int main()
{//bbb* a = maker();
//a->initialize();
//Creating an instance and calling the "initialize" function with in
PluginInterface* p = initialize();
p->initialize();return 0;
}

1

Решение

Читать внимательно и в несколько раз dlopen (3) справочная страница.

Когда путь flle не содержит / происходит какая-то конкретная обработка.

Вам следует dlopen путь как ./foo.so (иначе добавьте . в конце вашего LD_LIBRARY_PATH переменная окружения, но это может создать угрозу безопасности, поэтому я не советую это делать)

(всегда проверяйте NULL результат как dlopen а также dlsym вызовы функций и отображение dlerror() на провал)

Кстати, ваш менеджер плагинов должен быть скомпилирован с:

      g++ -Wall -g plugin_manager.cpp -o -plugin_manager -ldl

Не упоминать plugin_manager.o

2

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


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