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);

Надеюсь, это немного лучше объясняет ситуацию.

Ответы на вопрос(2)

Ваш ответ на вопрос