Linux C ++: dlopen не может найти библиотеку .so
Переписанный вопрос (хотя он уже решен):
У меня были проблемы с использованием dlopen (3) для загрузки библиотеки общих объектов в Linux. Библиотека является частью созданной мной системы библиотек, которые все загружаются во время выполнения центральным исполняемым файлом. Все это организовано в единую рабочую область в Code :: Blocks, где каждому проекту предоставляется собственная папка в каталоге с именем Source, который должен поставляться вместе с программой. Каталог сборки исполняемого файла - это два каталога в обратном направлении от его собственного исходного кода, так что исполняемая и исходная папки находятся в одном каталоге. Библиотеки также собираются в тот же каталог, что и исполняемый файл, поэтому, естественно, я передаю имя библиотеки Я пытаюсь открыть как показано:
int main(int argc, char** argv) {
void* hLibrary = dlopen("libLibrary.so", RTLD_NOW | RTLD_GLOBAL);
if(hLibrary == NULL) {
fprintf(stderr, "%s\n", dlerror());
return 1;
}
return 0;
}
Это работало в один момент, когда каталог сборки был таким же, как исходный код, пока я не изменил каталоги исходного кода в соответствии с расположением, описанным выше. Проблема на этом этапе заключается в том, что dlerror () возвращает «Не удается открыть libLibrary.so: такого файла или каталога нет», даже если файл явно существует и находится в том же каталоге, что и исполняемый файл. Затем я попытался передать файл "/libLibrary.so", потому что, согласно man-странице dlopen (3), добавление / указывает на относительный каталог. Это вернуло ту же ошибку.
Решением этой проблемы было то, что "./" было необходимо - где "." представляет рабочий каталог исполняемого файла - и рабочий каталог необходимо изменить в Code :: Blocks туда, где должен быть построен исполняемый файл. Следующее работает отлично:
void* hLibrary = dlopen("./libLibrary.so", RTLD_NOW | RTLD_GLOBAL);
Это не совсем полное решение, но следующее в основном эквивалентно тому, что я делаю:
void* hLibrary = dlopen("./../../libLibrary.so", RTLD_NOW | RTLD_GLOBAL);
Надеюсь, это немного лучше объясняет ситуацию.