Плагины C++ Проблемы ABI в Linux

Я работаю над системой плагинов для замены общих библиотек.

Я знаю о проблемах ABI при разработке API для общих библиотек, и точки входа в библиотеки, такие как экспортированные классы, должны быть тщательно спроектированы.

Например, добавление, удаление или изменение порядка частных переменных-членов экспортируемого класса может привести к различным ошибкам компоновки памяти и времени выполнения (насколько я понимаю, именно поэтому шаблон Pimpl может быть полезен). Конечно, есть много других подводных камней, которых следует избегать при изменении экспортируемых классов.

Я построил здесь небольшой пример, чтобы проиллюстрировать свой вопрос.

Во - первых, я предоставляю следующий заголовок для разработчика плагина :

// character.h
#ifndef CHARACTER_H
#define CHARACTER_H

#include <iostream>

class Character
{
public:
    virtual std::string name() = 0;
    virtual ~Character() = 0;
};

inline Character::~Character() {}

#endif

Затем плагин строится как общая библиотека "libcharacter.so" :

#include "character.h"
#include <iostream>

class Wizard : public Character
{
public:
    virtual std::string name() {
        return "wizard";
    }
};

extern "C"
{
    Wizard *createCharacter()
    {
        return new Wizard;
    }
}

И, наконец, основное приложение, которое использует плагин :

#include "character.h"
#include <iostream>
#include <dlfcn.h>

int main(int argc, char *argv[])
{
    (void)argc, (void)argv;

    using namespace std;

    Character *(*creator)();

    void *handle = dlopen("../character/libcharacter.so", RTLD_NOW);

    if (handle == nullptr) {
        cerr << dlerror() << endl;
        exit(1);
    }

    void *f = dlsym(handle, "createCharacter");
    creator = (Character *(*)())f;

    Character *character = creator();
    cout << character->name() << endl;

    dlclose(handle);

    return 0;
}

Достаточно ли определить абстрактный класс, чтобы избавиться от всех проблем ABI?

+1
2019-09-17 15:19:40
источник
0 ответов

Посмотрите другие вопросы по меткам