我是使用共享库的初学者。我需要一些指导如何解决问题。我想加载不同的* .so文件并加载它们并将生成的文件初始化对象存储在向量中。
我的想法是:调用加载库的函数并初始化库中属于类的一部分的函数。所以这些信息都是该类对象的一部分。然后我们将此对象克隆到另一个对象中并存储在类向量中。然后关闭此库并加载另一个库并重复相同的过程。
基于这个想法我有两个疑问:
如果有人可以请我在这里单挑,那将是非常有必要的吗?
答案 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