Biblioteki środowiska wykonawczego#
Aby zobrazować, że nawet proste programy zależą od zewnętrznych bibliotek środowiska wykonawczego, spójrz na dane wyjściowe narzędzia ldd
, który raportuje takie zależności:
$ ldd tabulate.exe
ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ff88f2b0000)
KERNEL32.DLL => /cygdrive/c/WINDOWS/System32/KERNEL32.DLL (0x7ff88e450000)
KERNELBASE.dll => /cygdrive/c/WINDOWS/System32/KERNELBASE.dll (0x7ff88b9e0000)
cygwin1.dll => /usr/bin/cygwin1.dll (0x180040000)
cyggfortran-5.dll => /usr/bin/cyggfortran-5.dll (0x3efd20000)
cygquadmath-0.dll => /usr/bin/cygquadmath-0.dll (0x3ee0b0000)
cyggcc_s-seh-1.dll => /usr/bin/cyggcc_s-seh-1.dll (0x3f7000000)
Inne kompilatory lub inne wersje tego samego kompilatora będą prawdopodobnie wymagały innych dynamicznych bibliotek. Dopóki program działa na tym samym komputerze — lub, bardziej precyzyjnie, w tym samym środowisku — nie powinno być żadnego problemu. Jeśli jednak taka biblioteka nie może zostać odnaleziona, otrzymasz (miejmy nadzieję) komunikat o błędzie, a program natychmiast się zatrzyma.
Dlatego dobrze jest wiedzieć jakie biblioteki są wymagane. Na Linuksie oraz środowiskach linuksowych, narzędzie ldd
jest bardzo pomocne. Na Windowsie natomiast warto skorzystać z narzędzia dependency walker
(najnowszą wersję, która działa bardzo dobrze na Windowsie 10 możesz znaleźć tutaj: lucasg/Dependencies)
Kolejną rzeczą, którą powinieneś wiedzieć jest to, gdzie program próbuje znaleźć te biblioteki. Jest to obszerny temat sam w sobie, pełen zawiłości i historii. Tutaj go tylko szybko wspomnimy:
Na Linuksie:
Używana jest zmienna środowiskowa
LD_LIBRARY_PATH
. Składa się z listy katalogów do przeszukania, każdy z nich oddzielony jest dwukropkiem (:) od pozostałych. Na przykład:/usr/lib:/usr/local/lib
- typowe katalogi systemowe.W procesie łączenie możesz również skorzystać z opcji określenia
RPATH
, listy katalogów umieszczanej w samym pliku wykonywalnym.Następnie przeszukiwanych jest kilka katalogów systemowych.
Na Windowsie:
Katalog zawierający program wykonywalny może również zawierać biblioteki dynamiczne.
Używana jest zmienna środowiskowa „PATH”. Ponownie lista katalogów do przeszukania, jednak teraz znakiem rozdzielającym jest średnik (;).
Przeszukiwane są katalogi systemowe.
Niestety, szczegóły tego procesu mogą się różnić w zależności od wersji systemu operacyjnego. Powyższe informacje mogą służyć jedynie za wskazówkę — używaj narzędzi takich jak „ldd” lub „dependency walker”, aby dokładnie dowiedzieć się jakie biblioteki są ładowane i gdzie się znajdują.
Jeśli chcesz udostępnić swój program współpracownikom, klientom, a nawet użytkownikom na całym świecie, musisz zadbać o to, aby oprócz samego programu, udostępnić również biblioteki, od których jest on zależny. Więcej informacji znajdziesz poniżej.