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.