gpt4 book ai didi

c++ - 运行时动态加载和单例

转载 作者:行者123 更新时间:2023-12-03 12:49:11 24 4
gpt4 key购买 nike

我有一个使用单例的程序。该程序在运行时加载共享对象库。该库也使用相同的单例。问题是,当从库访问单例时,会创建单例的新实例。

该程序与-rdynamic链接,我对两者都使用-fPIC,加载过程如下:

std::shared_ptr<Module> createModuleObject(const std::string& filename)
{
if (!fs::exists(filename))
throw std::runtime_error("Library not found: " + std::string(filename));

struct export_vtable* imports;
void *handle = dlopen(filename.c_str(), RTLD_LAZY | RTLD_GLOBAL);

if (handle) {
imports = static_cast<export_vtable*>(dlsym(handle, "exports"));
if (imports)
return std::shared_ptr<Module>(imports->make());
else
throw std::runtime_error("Error trying to find exported function in library!");
} else
throw std::runtime_error("Error trying to load library: " + std::string(filename));
}

库导出这样的类:

Module* make_instance()
{
return new HelloWorld();
}
struct export_vtable
{
Module* (*make)(void);
};
struct export_vtable exports = { make_instance };

该类使用单例。

这就是创建单例的方式(Configuration.cpp):

std::unique_ptr<Configuration> Configuration::instance_(nullptr);
std::once_flag Configuration::onlyOnceFlag_;

Configuration& Configuration::instance()
{
if (instance_ == nullptr)
{
std::cout << "INSTANCE IS NULL, CREATING NEW ONE" << std::endl;
std::call_once(Configuration::onlyOnceFlag_,
[] {
Configuration::instance_.reset(new Configuration());
});
}

return *Configuration::instance_;
}

程序和库都链接到Configuration.cpp。如果我从库中省略它,则在尝试访问单例时会收到 undefined symbol 错误。

有人知道如何解决这个问题吗?非常感谢!

最佳答案

这是我解决这个问题的方法 https://github.com/kvahed/codeare/blob/master/src/core/ReconStrategy.hpp加载共享对象后,我将全局单例 Workspace 的实例分配给 dll 中加载的类。 https://github.com/kvahed/codeare/tree/master/src/modules中的所有类(class)派生自 ReconStrategy 并位于共享对象中。好处是这段代码是可移植的。

构建这样的 ReconStrategy 时会发生这种情况:

ReconContext::ReconContext (const char* name) {
m_dlib = LoadModule ((char*)name);
if (m_dlib) {
create_t* create = (create_t*) GetFunction (m_dlib, (char*)"create");
m_strategy = create();
m_strategy->Name (name);
m_strategy->WSpace (&Workspace::Instance());
} else {
m_strategy = 0;
}
}
}

这里的关键行是m_strategy->WSpace (&Workspace::Instance());

关于c++ - 运行时动态加载和单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46193069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com