【发布时间】:2019-11-16 09:27:58
【问题描述】:
我有一个 C++ CMake 项目,它有多个我打包到共享库中的子项目。然后,作为可执行文件的项目本身与所有这些共享库链接。这是一个正在从 Windows 移植到 Ubuntu 的项目。我所做的是让可执行文件 EXE 使用一个子项目 Core 来打开所有其他库。问题是这在 Linux 上不起作用。
这是EXE:
int main(int argc, char *argv[])
{
core::plugin::PluginManager& wPluginManager = core::plugin::PluginManagerSingleton::Instance();
wPluginManager.loadPlugin("libcore.so");
wPluginManager.loadPlugin("libcontroller.so")
wPluginManager.loadPlugin("libos.so")
wPluginManager.loadPlugin("libnetwork.so")
wPluginManager.loadPlugin("liblogger.so")
}
这是core::plugin::PluginManager::loadPlugin():
bool PluginManager::loadPlugin(const boost::filesystem::path &iPlugin) {
void* plugin_file = dlopen(plugin_file_name, RTLD_LAZY);
std::cout << (plugin_file ? " success" : "failed") << std::endl;
return true;
}
发生的情况是 libcore 被正确加载,但是所有其他库都失败了,没有错误消息。我不知道为什么它不起作用。然而,当我做同样的事情,而不是让 Core 加载库时,我只是在 main 中执行它并且它可以工作。
基本上,我可以从exe 加载库,但不能从其他共享库加载。什么给出了,我该如何解决这个问题?
【问题讨论】:
-
“失败,没有错误信息”。那你怎么知道他们失败了?
-
@n.m.因为在调试之后,dlopen 只是简单地返回 null。
-
dlerror()在dlopen失败后返回什么? -
@PaulSanders 这很奇怪,但是 dlerror() 冻结了我的程序。如果我将它添加为 dlopen() 之后的下一条语句,则将冻结在该行上。即使 dlopen 成功也是如此。
-
嗯,奇怪。
dlopen失败后,errno中的内容是什么?事先将其归零以避免误导性结果。
标签: c++ linux shared-libraries dlopen