Tworzenie własnej biblioteki statycznej stworzenie plików źródłowych :stackoverflow questions : how-can-i-create-and-use-my-own-static-library-in-c c pliku nagłówkowego dodanie numeru wersji biblioteki i numeru kompilacji (ang. build version) kompilacja plików źródłowychstackoverflow questions : how-to-compile-library-on-c-using-gcc 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.pcstackoverflow questions : best-practices-on-my-library-coded-in-c do /usr/local/lib/pkgconfig/ w celu rozpoznawania przez pkg-config zaimportuj bibliotekę do swojego programu : w kodzie programu dodaj #include dodaj opcje kompilatora : gcc -lmylib opublikuj kod na serwerze , np github lub gitlab
Przykład :http://stackoverflow.com/questions/33820287/using-header-files-in-c 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 ?
Za pomocą nm : stackoverflow question : is-there-any-way-to-list-all-functions-in-a-c-library
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
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
Zasady numerowania wersji numeracja wersji oprogramowaniawikipedia : Numeracja wersji oprogramowaniasemantic-versioningstackoverflow question : code-version-change-rules Cykl życia programu wikipedia : Cykl życia programu
w bibliotece statycznej Numer wersji w nazwie pliku : libmy.so.1.2 w łańcuchu ( string)stackoverflow question: how-to-store-a-version-number-in-a-static-library 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 za pomocą pliku version.cstackoverflow question: generating-library-version-and-build-version
Biblioteki dynamiczne dlclose, dlopen, dlmopen - open and close a shared object