C/Biblioteki: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
m →‎Zależności: problemy
literówki, zbędne spacje
Linia 1:
==Czym jest biblioteka==
Biblioteka <ref>http://tldp.org/HOWTO/Program-Library-HOWTO/</ref> jest to zbiór funkcji, które zostały wydzielone po to, aby dało się z nich korzystać w wielu programach. Ułatwia to programowanie - nie musimy np. sami tworzyć funkcji ''printf''. Każda biblioteka posiada swoje pliki nagłówkowe, które zawierają deklaracje funkcji bibliotecznych oraz często zawarte są w nich komentarze, jak używać danej funkcji. W tej części podręcznika nauczymy się tworzyć nasze własne biblioteki.
 
Cechy biblioteki :
* składa się co najmniej z dwóch plików : jeden nagłówkowy ( żródłowyźródłowy) i jeden binarny ( skompilowany )
* zawiera funkcje (deklaracje w nagłówkowym i definicje w binarnym )
* w postaci pakietu ( ang. package ) może dzielić się na pakiety dev i non-dev<ref>[http://stackoverflow.com/questions/480764/linux-error-while-loading-shared-libraries-cannot-open-shared-object-file-no-s stackoverflow question: linux-error-while-loading-shared-libraries-cannot-open-shared-object-file-no-s]</ref>
 
==typy==
====wg sposobu wykorzystania ====
* statyczne ( ang. static library or statically-linked library )
** windows : .lib lub .obj
** Unix : .a lub .o
* dynamiczne<ref>[http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html Static, Shared Dynamic and Loadable Linux Libraries from yolinux]</ref>
** biblioteka łączona dynamicznie,
*** Unix : bliotekabiblioteka współdzielona (ang. shared library<ref>[http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html HOWTO : shared-libraries]</ref><ref>[http://www.akkadia.org/drepper/dsohowto.pdf drepper : how to write shared library]</ref>, shared object) .so, ścieżki poszukiwań plików bibliotek zapisane są w pliku /etc/ld.so.conf oraz w zmiennej środowiskowej $LD_LIBRARY_PATH.
*** Windows : .dll
** biblioteki ładowane dynamicznie
 
==== wg autora ====
Linia 33:
==Ścieżka wyszukiwania ==
 
[[C/Używanie_kompilatora#GCC|Gcc]] w sytemiesystemie Linuks wyszukuje nagłówki <code>#include <file></code> w kilku standardowych katalogach: <ref>[https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html gcc : Search-Path]</ref><ref>[http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026 Where Does GCC Look to Find its Header Files? by Joshua Davie]</ref>
 
/usr/local/include
Linia 40:
/usr/include
 
Możemy to sprawdzić za pomocą przełączników przy kompilacji :
 
gcc c.c -v -c
 
przykładowy wynik :
 
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
Linia 58 ⟶ 56:
End of search list.
 
Zmienna środowiskowa [[Bash#LD_LIBRARY_PATH|LD_LIBRARY_PATH]] zawiera [[C/Używanie_kompilatora#Scie.C5.BCki|ścieżki do katalogów]] bibliotek. Te katalogi kompilator będzie przeszukiwał w trakcie kompilacji:<ref>[http://stackoverflow.com/questions/558803/how-to-add-a-default-include-path-for-gcc-in-linux?rq=1 stackoverflow :How to add a default include path for gcc in linux?]</ref>
 
 
Zmienna środowiskowa [[Bash#LD_LIBRARY_PATH|LD_LIBRARY_PATH]] zawiera [[C/Używanie_kompilatora#Scie.C5.BCki|ścieżki do katalogów]] bibliotek. Te katalogi kompilator będzie przeszukiwał w trakcie kompilacji:<ref>[http://stackoverflow.com/questions/558803/how-to-add-a-default-include-path-for-gcc-in-linux?rq=1 stackoverflow :How to add a default include path for gcc in linux?]</ref>
LD_LIBRARY_PATH
W celu dopisania ścieżki do własnej biblioteki ustaw wartość zmiennej środowiskowej, na przykład w konsoli wpisz:
Linia 68 ⟶ 64:
 
 
Sprawdzamy jakie ścieżki są przeszukiwane :<ref>[http://stackoverflow.com/questions/4980819/gcc-include-directories?lq=1 Stackoverflow : GCC include directories ]</ref>
 
 
echo | gcc -Wp,-v -x c++ - -fsyntax-only
 
przykładowy wynik :
<pre>
ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/4.8"
Linia 96 ⟶ 90:
* pliku źródłowego, zawierającego ciała funkcji (plik z rozszerzeniem .c)
 
Biblioteka po skompilowaniu składa się z dwóch plików :
* nagłówkowy ( żródłowyźródłowy)
* binarny ( skompilowany )
 
===Budowa pliku nagłówkowego===
Linia 152 ⟶ 146:
 
Jak widać nasza pierwsza biblioteka działa.
 
 
=== Zmiana dostępu do funkcji i zmiennych (static i extern) ===
Język C, w przeciwieństwie do swego młodszego krewnego - C++ nie posiada praktycznie żadnych mechanizmów ochrony kodu biblioteki przed modyfikacjami. [[C++]] ma w swoim asortymencie m.in. sterowanie uprawnieniami różnych elementów klasy. Jednak programista, piszący program w C nie jest tak do końca bezradny. Autorzy C dali mu do ręki dwa narzędzia: '''extern''' oraz '''static'''. Pierwsze z tych słów kluczowych informuje kompilator, że dana funkcja lub zmienna istnieje, ale w innym miejscu, i zostanie dołączona do kodu programu w czasie łączenia go z biblioteką.
Linia 184 ⟶ 176:
 
Odwrotne działanie ma słowo kluczowe '''static''' użyte w tym kontekście (użyte wewnątrz bloku tworzy zmienną statyczną, więcej informacji w rozdziale [[C/Zmienne#static|Zmienne]]). Może ono odnosić się zarówno do zmiennych jak i do funkcji globalnych. Powoduje, że dana zmienna lub funkcja jest '''niedostępna''' na zewnątrz biblioteki<ref>Tak naprawdę całe "ukrycie" funkcji polega na zmianie niektórych danych w pliku z kodem binarnym danej biblioteki (pliku .o), przez co linker powoduje wygenerowanie komunikatu o błędzie w czasie łączenia biblioteki z programem.</ref>. Możemy dzięki temu ukryć np. funkcje, które używane są przez samą bibliotekę, by nie dało się ich wykorzystać przez '''extern'''.
 
 
==Rozwiązywanie problemów==
* ustal jaką bibliotekę potrzebujesz
Linia 192 ⟶ 182:
** jeśli nie to zainstaluj
* ścieżki
** gdzie jest zainstalowana biblioteka ( pliki binarne i nagłówkowe)
** gdzie kompilator/program wyszukuje biblioteki
** pokaż kompilatorowi/programowi gdzie szukać bibliotekę
 
===Zależności===
* ldd
* wyszukiwanie w kodzie <ref>[https://balau82.wordpress.com/2013/11/24/analyzing-c-source-files-dependencies-in-a-program/ analyzing-c-source-files-dependencies-in-a-program by balau82]</ref><noinclude>
 
 
<noinclude>
{{Przypisy}}
{{Nawigacja|C|