C/Biblioteki własne

< 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 :

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

  • numeracja wersji oprogramowania[6][7][8]
  • Cykl życia programu [9]

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
  1. stackoverflow questions : how-can-i-create-and-use-my-own-static-library-in-c
  2. stackoverflow questions : how-to-compile-library-on-c-using-gcc
  3. stackoverflow questions  : best-practices-on-my-library-coded-in-c
  4. http://stackoverflow.com/questions/33820287/using-header-files-in-c
  5. stackoverflow question : is-there-any-way-to-list-all-functions-in-a-c-library
  6. wikipedia : Numeracja wersji oprogramowania
  7. semantic-versioning
  8. stackoverflow question : code-version-change-rules
  9. wikipedia : Cykl życia programu
  10. stackoverflow question: how-to-store-a-version-number-in-a-static-library
  11. stackoverflow question: generating-library-version-and-build-version