Niedoceniane libclntsh

Domyślna procedura linkowania programów używających Oracle (czy to pisanych w Pro*C czy też wykorzystujących biblioteki OCI) bazuje na zlinkowaniu programu statycznie z całą serią bibliotek Oracle. To działa (gdy już określimy właściwą dla danej podwersji listę nazw bibliotek) ale jest uciążliwe z dwóch przyczyn:

  • nawet dla naprawdę niewielkich programów powstają duże lub bardzo duże wykonywalne pliki wynikowe;
  • linkowanie trwa na tyle długo (w typowych konfiguracjach sprzętowych czas rzędu minut), że jest to uciążliwe.

Życie można sobie uprościć wykorzystując słabo udokumentowaną bibliotekę libclntsh. Jest to standardowo instalowana w ramach instalacji Oracle biblioteka dzielona (np. .so na Linuxie czy Tru64, .exe na VMS) a co za tym idzie zlinkowanie się z nią jest bardzo szybkie a powstające binarki niewielkie. Jest to niesłychanie wygodne przynajmniej w trakcie programowania i testów (sam używam wersji linkowanych z libclntsh także w instalacjach produkcyjnych).

Przed rozpoczęciem jej używania warto wiedzieć, że biblioteka ta jest przebudowywana przez Oracle w trakcie instalacji. Co więcej, może mieć różną zawartość, zależnie od tego które elementy Oracle zainstalowaliśmy i w jakiej kolejności (wiele opcjonalnych modułów dorzuca swoje biblioteki które mogą być dolinkowane do libclntsh, przelinkowanie tej biblioteki nie zawsze następuje automatycznie). Dlatego

  • po zainstalowaniu wszystkich używanych komponentów Oracle (nawet jeśli robiliśmy to jedną sesją instalatora) warto "z palca" przebudować bibliotekę - wołając skrypt $ORACLE_HOME/bin/genclntsh;
  • jeśli linkujemy z tą biblioteką kod produkcyjny instalowany na innych maszynach niż developerska, warto rozważyć dystrybucję tej biblioteki wraz z naszym kodem (i ustawianie konfiguracji uruchomieniowej tak, by miała ona pierwszeństwo w stosunku do ewentualnych innych wersji).

Z moich doświadczeń wynika, że nawet pamiętając o przelinkowaniu biblioteki, niekiedy (zależy to zarówno od wersji Oracle jak środowiska systemowego i rodzaju API którego używamy) linkując się tylko z libclntsh otrzymamy błędy linkowania wynikające z braku zdefiniowanych symboli. Najbezpieczniejsze jest tworzenie poleceń linkowania w których jako pierwszą linkowaną bibliotekę podajemy właśnie libclntsh a następnie standardowe biblioteki statyczne. Zostaną one wykorzystane do pobrania symboli których linker nie znajdzie w bibliotece dzielonej. Nadal linkowanie będzie istotnie szybsze niż bez libclntsh a binarki mniejsze niż w linkowaniu czysto statycznym.

komentarze obsługiwane przez Disqus