C/Biblioteki własne
Wygląd
< C
Tworzenie własnej biblioteki statycznej
[edytuj]- stworzenie plików źródłowych :[1]
- c
- pliku nagłówkowego
- dodanie numeru wersji biblioteki i numeru kompilacji (ang. build version)
- kompilacja plików źródłowych[2] do pliku objektowego (.so), za pomocą CMAKE
- utwórz plik archiwum libmylib.a za pomocą ar
- skopiuj bibliotekę do standardowego katalogu bibliotek : /usr/lib
- opcja : dodaj mylib.pc[3] do /usr/local/lib/pkgconfig/ w celu rozpoznawania przez pkg-config
- zaimportuj bibliotekę do swojego programu :
- w kodzie programu dodaj #include<mylib.h>
- dodaj opcje kompilatora : gcc -lmylib
- opublikuj kod na serwerze , np github lub gitlab
Przykład :[4]
gcc -o library.o library.c gcc -o someother.o someother.c ar a libmylib.a library.o someother.o gcc c.c -lmylib
Jak sprawdzić listę funkcji w skompilowanej bibliotece ?
[edytuj]Za pomocą nm :[5]
nm -D /usr/lib/libgme.so.0
Fragment przykładowego wyniku :
U __assert_fail 000000000024c110 A __bss_start U cos w __cxa_finalize U __cxa_guard_acquire U __cxa_guard_release U __cxa_pure_virtual 000000000024c110 A _edata 000000000024c1c0 A _end U fclose U feof 00000000000382a8 T _fini U floor U fmod
Ścieżka wyszukiwania i katalogi
[edytuj]Mamy do wyboru instalację w katalogach :
- standardowych
- niestandardowych ( własnych)
Domyślna standardowa lokalizacja :
- /usr/local/lib ( pliki binarne )
- /usr/local/include ( pliki nagłówkowe )
Niestandardowe katalogi :
- /usr/local/include/mylib/ dla plików nagłówkowych
- /usr/local/lib/libmylib.a ( lub /usr/local/lib/libmylib.so dla bibliotek dynamicznych)
Inne:
C_INCLUDE_PATH=/your_include_path export C_INCLUDE_PATH
oraz dodanie do pliku ~/.bash_profile w przypadki BASH
oraz dodanie katalogu z plikiem binarnym :
-L
Sprawdzanie domyślnego katalogu :
echo $LD_LIBRARY_PATH
numer wersji
[edytuj]Zasady numerowania wersji
w bibliotece statycznej
[edytuj]Numer wersji
- w nazwie pliku : libmy.so.1.2
- w łańcuchu ( string)[10]
- w strukturze
- w makro
- #ident ( dyrektywa gcc)
Tworzymy łańcuch:
char* library_version = { "Version: 1.3.6" };
sprawdzamy z konsoli :
strings library.a | grep Version | cut -d " " -f 2
#define MYLIB_MAJOR_VERSION 1
#define MYLIB_MINOR_VERSION 2
#define MYLIB_REVISION 3
#define MYLIB_VERSION "1.2.3"
#define MYLIB_VERSION_CHECK(maj, min) ((maj==MYLIB_MAJOR_VERSION) && (min<=MYLIB_MINOR_VERSION))
struct {
const char* string;
const unsigned major;
const unsigned minor;
const unsigned revision;
} mylib_version = { MYLIB_VERSION, MYLIB_MAJOR_VERSION, MYLIB_MINOR_VERSION, MYLIB_REVISION };
numer kompilacji
[edytuj]- za pomocą pliku version.c[11]
Biblioteki dynamiczne
[edytuj]Źródła
[edytuj]- ↑ stackoverflow questions : how-can-i-create-and-use-my-own-static-library-in-c
- ↑ stackoverflow questions : how-to-compile-library-on-c-using-gcc
- ↑ stackoverflow questions : best-practices-on-my-library-coded-in-c
- ↑ http://stackoverflow.com/questions/33820287/using-header-files-in-c
- ↑ stackoverflow question : is-there-any-way-to-list-all-functions-in-a-c-library
- ↑ wikipedia : Numeracja wersji oprogramowania
- ↑ semantic-versioning
- ↑ stackoverflow question : code-version-change-rules
- ↑ wikipedia : Cykl życia programu
- ↑ stackoverflow question: how-to-store-a-version-number-in-a-static-library
- ↑ stackoverflow question: generating-library-version-and-build-version