加载不同的共享库c ++

时间:2016-05-22 17:37:30

标签: c++11 object shared-libraries dynamic-library cloning

我是使用共享库的初学者。我需要一些指导如何解决问题。我想加载不同的* .so文件并加载它们并将生成的文件初始化对象存储在向量中。

我的想法是:调用加载库的函数并初始化库中属于类的一部分的函数。所以这些信息都是该类对象的一部分。然后我们将此对象克隆到另一个对象中并存储在类向量中。然后关闭此库并加载另一个库并重复相同的过程。

基于这个想法我有两个疑问:

  1. 这种加载差异库的方法是否会保留不同对象的内容并且独立行动?
  2. 如果想法看起来不错,那么在这里克隆对象的最佳方法是什么?
  3. 如果有人可以请我在这里单挑,那将是非常有必要的吗?

1 个答案:

答案 0 :(得分:0)

如果您正在寻找"类的自动注册" (或者更准确地说,是工厂)从.so文件加载,你可以依赖于在每个.so中调用一个全局构造函数来执行"工厂注册"在.so负载。

这个想法被称为"运行时类注册"

假设.so文件代表我们想要注册的算法,因此程序将保存所有.so文件中定义的所有算法。

在每个.so中都应该有一个.cpp文件,它将执行以下操作:

multiCapabilities

例如:

REGISTER_ALGORITHM (<Algorithm_Class_Name>)

REGISTER_ALGORITHM将是一个具有以下实现的宏:

REGISTER_ALGORITHM (BfsAlgorithm)

AlgorithmRegistration将是一个具有以下实现的类:

#define REGISTER_ALGORITHM(class_name) \
    AlgorithmRegistration register_me_##class_name \
        ([]{return make_unique<class_name>();}, #class_name);

AlgorithmRegistrar将是一个实际管理所有已注册算法容器的Singleton,例如:

struct AlgorithmRegistration {
    AlgorithmRegistration(function<unique_ptr<AbstractAlgorithm>()>, string name);
};

AlgorithmRegistration::AlgorithmRegistration(std::function<unique_ptr<AbstractAlgorithm>()> algorithmFactory, string name) {
    AlgorithmRegistrar::getInstance().registerAlgorithm(algorithmFactory, name);
}

现在你可以有一个主要的:

class AlgorithmRegistrar {
    list<std::string> algorithmNames;
    list<std::function<unique_ptr<AbstractAlgorithm>()>> algorithmFactories;
    void registerAlgorithm(std::function<unique_ptr<AbstractAlgorithm>()> algorithmFactory, const string& name) {
        algorithmFactories.push_back(algorithmFactory);
        algorithmNames.push_back(name);
    }
public:
    friend struct AlgorithmRegistration;
    list<unique_ptr<AbstractAlgorithm>> getAlgorithms()const {
        list<unique_ptr<AbstractAlgorithm>> algorithms;
        for(auto algorithmFactoryFunc : algorithmFactories) {
            algorithms.push_back(algorithmFactoryFunc());
        }
        return algorithms;
    }
    const list<std::string>& getAlgorithmNames()const {
        return algorithmNames;
    }
    size_t size()const {
        return algorithmFactories.size();
    }
    static AlgorithmRegistrar& getInstance() {
        static AlgorithmRegistrar instance;
        return instance;
    }
};

(上面的代码没有显示.so文件的实际负载,这些负载应该用dlopen完成,稍后用dlclose关闭。注意,由于自动注册,不需要使用dlsym)。 / p>

工厂注册的代码示例:http://coliru.stacked-crooked.com/a/283feaa9ffb62dd1