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.