2011-12-22 9 views
11

Zauważyłem błąd w aplikacjach w zależności od bibliotek współdzielonych: jeśli nie masz pewnej zależności, aplikacja ulegnie awarii po załadowaniu , nawet jeśli użytkownik nie zamierza korzystać z funkcji zależności.Opcjonalne biblioteki współdzielone

Chciałbym, aby moje aplikacje były lepsze. Najlepiej, zamiast dystrybuować aż n różnych pakietów, gdzie n = liczbaOfSupportedArchitectures * numberOfSupportedOS * Π (dla każdej biblioteki współdzielonej) (liczba alternatyw) Wychwyciłbym błąd "Błąd podczas ładowania bibliotek współdzielonych" w czasie ładowania, gdy biblioteka, której chcę, ale nie potrzebuję, jest nieobecna, a następnie kontynuuj wykonywanie w sposób, który pozwala uniknąć użycia nierozwiązanych odnośników. Ale oczywiście nie ma wyjątków, które można złapać. Jeśli czegoś brakuje, wszystko upada, zanim main() się zacznie.

Najbliżej mogę uzyskać kontrolę nad procesem ładowania sam rozwiązuję wszystkie linki z dlopen, dlsym i innymi. Tak męczące. Spodziewałbym się, że będzie już dostępna biblioteka dla mnie?

Zauważam, że nie byłoby to problemem w źródłowej dystrybucji ani w oknach. Zamierzałem umieścić w tagach pakiety binarne, ale najwyraźniej nie mam przedstawiciela do tagów monet.

"Wydaje się, że najbardziej eleganckim rozwiązaniem byłoby udoskonalenie zachowania ładowaczy/łączników OS.

Odpowiedz

0

Użytkownik może dołączyć biblioteki współdzielone samodzielnie i dostosować ścieżkę wyszukiwania łącznika za pomocą -rpath $ORIGIN.

+0

Lub uruchom program za pomocą skryptu, który ustawia zmienną środowiskową 'LD_LIBRARY_PATH'. – rodrigo

+0

Alternatywy do ładowania biblioteki nie są tylko różnymi wersjami rzeczy, będą miały zupełnie inne interfejsy, albo będą całkowicie nieobecne, a ich funkcjonalność nie będzie widoczna w UX. Chociaż może to stanowić sposób na obsługę nieobecnych bibliotek; Mógłbym stworzyć obojętne biblioteki shillów z tym samym interfejsem, co brakujące cele, gdzie, w przypadku braku celów, mogłyby zaspokoić potrzebę połączenia linkera z czymś. Wydaje się jednak głupie. – mako

2

Możesz spojrzeć na weak symbols. Jednak nie jest to część standardu C lub C++ - a więc nieco zależna od kompilatora. Ale jeśli wybierasz się na GCC, to chyba będzie dla ciebie działało.

+0

Czy nie wymagałoby to określenia ciałek obojętnych dla każdego symbolu w nagłówkach bibliotek? – mako

+1

Niezupełnie. Możesz sprawdzić istnienie symbolu. Jeśli masz 'void foo();' możesz wywołać je w następujący sposób: 'if (foo) foo();' – Krizz

+0

Ah. Ale będę musiał ogłosić je wszystkie jako słabe symbole? – mako