C ++ linux: dlopen nie może znaleźć biblioteki .so

Przepisane pytanie (chociaż zostało już rozwiązane):

Miałem problemy z używaniem dlopen (3) do ładowania biblioteki obiektów współdzielonych na Linuksie. Biblioteka jest częścią systemu zbudowanych przeze mnie bibliotek, które są ładowane w czasie wykonywania przez centralny plik wykonywalny. Wszystko to jest zorganizowane w jeden obszar roboczy w Code :: Blocks, gdzie każdy projekt otrzymuje własny folder w katalogu o nazwie Source, który ma zostać dostarczony z programem. Katalog kompilacji pliku wykonywalnego to dwa katalogi do tyłu z własnego kodu źródłowego, tak że folder możliwy do wykonania i źródłowy znajdują się w tym samym katalogu. Biblioteki również budują ten sam katalog, co plik wykonywalny, więc naturalnie przekazuję nazwę biblioteki Próbuję otworzyć jak pokazano:

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

To działało w pewnym momencie, gdy katalog kompilacji był taki sam jak kod źródłowy, dopóki nie zmieniłem katalogów kodu źródłowego na układ opisany powyżej. Problem w tym momencie polega na tym, że dlerror () zwraca „Nie można otworzyć libLibrary.so: nie ma takiego pliku lub katalogu”, nawet jeśli plik wyraźnie istnieje i znajduje się w tym samym katalogu, co plik wykonywalny. Następnie spróbowałem przekazać „/libLibrary.so”, ponieważ zgodnie ze stroną man na dlopen (3) dodanie / wskazuje względny katalog. To zwróciło ten sam błąd.

Rozwiązaniem było to, że potrzebna była „./” - gdzie „.” reprezentuje katalog roboczy pliku wykonywalnego - a katalog roboczy musiał zostać zmieniony w Code :: Blocks, gdzie plik wykonywalny miał zostać zbudowany. Poniższe działa doskonale:

void* hLibrary = dlopen("./libLibrary.so", RTLD_NOW | RTLD_GLOBAL);

To naprawdę nie pokazuje pełnego rozwiązania, ale poniższe jest w zasadzie odpowiednikiem tego, co robię:

void* hLibrary = dlopen("./../../libLibrary.so", RTLD_NOW | RTLD_GLOBAL);

Mam nadzieję, że to wyjaśnia sytuację nieco lepiej.

questionAnswers(2)

yourAnswerToTheQuestion