Загрузка производного полиморфного класса с использованием dlopen - PullRequest
0 голосов
/ 27 сентября 2018

В коде C ++ я пытаюсь создать основной модуль, который определяет полиморфный базовый класс, который динамически загружает производные классы для него во время выполнения.Основной модуль имеет что-то вроде:

class Base {
public:
    virtual ~Base();
    virtual int f() = 0;
};

int main() {
    auto make_a_ptr = /* load function pointer make_a from module using dsym */;
    Base* a = make_a_ptr();
    std::cout << a->f() << std::endl;
    delete a;
}

Динамически загружаемый внешний модуль имеет:

class A : public Base {
public:
    int f() {
        return 123;
    }
};

extern "C" Base* make_a() {
    return new A;
}

Будет ли система, подобная этой, работать в Linux, без дополнительных шагов, касающихся динамического связывания?Потому что здесь только make_a явно загружено с использованием dlsym(), но основной модуль также вызовет A::f() и A::~A() и получит доступ к v-таблице A.Будет ли это работать, даже если эти символы не были явно загружены?

И возможна ли подобная система на платформе Windows?

1 Ответ

0 голосов
/ 27 сентября 2018

В коде C ++ я пытаюсь создать основной модуль, определяющий полиморфный базовый класс, который динамически загружает производные классы для него во время выполнения.

Пока все хорошо,Остерегайтесь всех обычных предостережений - среди них:

  • Используйте те же версии компилятора и библиотеки при компиляции плагинов.По крайней мере, убедитесь, что ABI совместимы.

  • Ссылка на общую среду выполнения c ++ при выполнении этого на окнах.

  • окна потребуютddlexport / dllimport атрибуты в объявлениях.

  • скомпилируйте совместно используемые библиотеки linux с -fPIC

  • убедитесь, что имена символов лениво загружаютсячтобы избежать конфликтов (например, если у 2 общих библиотек есть экспортируемая функция с именем make_a.

Будет ли система, подобная этой, работать в Linux, без дополнительных шагов, касающихся динамическогосвязывание?

Да

А возможна ли подобная система на платформе Windows?

Да. Снова, посмотрите предостережения и проведите некоторое исследование.

Несколько хороших ответов здесь: Есть ли элегантный способ избежать dlsym при использовании dlopen в C?

...