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;
}
Флаги для использования с dlopen
зависят от дистрибутива. Я думаю, что Debian и его производные используют RTLD_GLOBAL | RTLD_LAZY
, а Red Hat и производные используют RTLD_GLOBAL
. Или, может быть, это наоборот. Кажется, я помню, что Android тоже использует RTLD_LOCAL
.
Вы должны просто попробовать оба варианта, чтобы упростить загрузку на разных платформах:
bool PluginManager::loadPlugin(const boost::filesystem::path &iPlugin) {
void* plugin_file = dlopen(plugin_file_name, RTLD_GLOBAL);
if (!plugin_file) {
plugin_file = dlopen(plugin_file_name, RTLD_GLOBAL | RTLD_LAZY);
}
const bool success = plugin_file != NULL;
std::cout << (success ? "success" : "failed") << std::endl;
return success ;
}
То, что происходит, - то, что libcore загружается должным образом, но тогда все другие библиотеки терпят неудачу без сообщения об ошибке
Это звучит немного необычно. Похоже, что дополнительные библиотеки из подпроектов не находятся в пути компоновщика.
Вы должны убедиться, что дополнительные библиотеки находятся в пути компоновщика. Поместите их рядом с libcore.so
в файловой системе, поскольку загрузка libcore.so
, кажется, работает должным образом.
Если они уже находятся рядом с libcore.so
, то вам необходимо предоставить дополнительную информацию, такую как ошибка loadPlugin
, использованный RUNPATH
(если имеется) и выходные данные ldd
.
но тогда все остальные библиотеки перестают работать без сообщения об ошибке. Я не могу понять, почему это не работает.
Как отметил @Paul в комментариях, способ проверки на наличие ошибки dlopen
заключается в dlerror
. Это довольно дурацкий способ сделать это, поскольку вы можете получить только текстовую строку, а не код ошибки.
Справочная страница dlopen
находится по адресу http://man7.org/linux/man-pages/man3/dlopen.3.html, и гласит:
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха dlopen () и dlmopen () возвращают ненулевой дескриптор для
загруженная библиотека. При ошибке (файл не найден, не читается,
имели неправильный формат или вызвали ошибки при загрузке), эти
функции возвращают NULL.
В случае успеха dlclose () возвращает 0; в случае ошибки возвращается ненулевое значение.
Ошибки этих функций можно диагностировать с помощью dlerror (3).