poniedziałek, 10 marca 2014

Tworzenie biblioteki statycznej - Linux

Chciałbym dzisiaj pokazać jak stworzyć oraz podlinkować stworzoną przez siebie bibliotekę statyczna.

Na początek coś na temat statycznej biblioteki (static library) - teoria.
Jest to biblioteka funkcji i podprogramów, która łączona jest z programem w momencie konsolidacji. W przypadku narzędzi dostarczonych przez Microsoft dla systemów z rodziny Windows pliki bibliotek mają zazwyczaj rozszerzenia .lib lub .obj, natomiast dla pakietów w systemach z rodziny Unix (np. GCC) i ich portach dla systemu Microsoftu (jakim jest np. MinGW) są to .a lub .o.

Rozważmy na początek pewien prosty przykład. Będziemy mieli łącznie trzy pliki. Dwa z prawie takimi samymi funkcjami oraz jeden plik z main-em programu.

Pierwszy plik - funkcja1.cpp
void funkcja1(int &p_arg1)
{
  p_arg1 = 55;
}
Drugi plik - funkcja2.cpp
void funkcja2(int &p_arg1)
{
  p_arg1 = 77;
}
Main programu - main.cpp
#include 

using namespace std;

void funkcja1(int &p_arg1);
void funkcja2(int &p_arg1);

int main()
{
  int l_liczba = 10;
  cout << "l_liczba = " << l_liczba << endl;
 
  funkcja1(l_liczba); 
  cout << "l_liczba = " << l_liczba << endl;
 
  funkcja2(l_liczba);
  cout << "l_liczba = " << l_liczba << endl;

  return 0;
}
Gdybyśmy chcieli by zadziałał powyższy przykład należałoby skompilować wszystkie pliki:
g++ main.cpp funkcja1.cpp funkcja2.cpp  -Wall -o main
Stwórzmy teraz bibliotekę statyczną.

1. Skompilujmy pliki funkcja1.cpp oraz funkcja2.cpp.
g++ -Wall -c funkcja1.cpp funkcja2.cpp
Flaga -Wall wyświetli wszystkie warningi podczas kompilacji. Utworzyły nam się pliki funkcja1.o oraz funkcja2.o.

2. Czas stworzyć bibliotekę wydając komendę:
ar -cvq bibliotekaTestowa.a funkcja1.o funkcja2.o
Dzięki temu zabiegowi utworzył nam się plik/biblioteka:
bibliotekaTestowa.a
3. Można wyświetlić całą zawartość nowo utworzonej biblioteki za pomocą komendy :
ar -t bibliotekaTestowa.a
4. Na sam koniec pozostało przetestować naszą bibliotekę:
g++ -o [plik wykonywalny] main.cpp bibliotekaTestowa.a

g++ -o main main.cpp bibliotekaTestowa.a
Istnieje jeszcze druga możliwość. Jeżeli biblioteka znajduje się w innym katalogu to wystarczy:
g++ -o [plik wykonywalny] main.cpp [sciezka do katalogu]/bibliotekaTestowa.a

g++ -o main main.cpp yy/bibliotekaTestowa.a

Na zakończenie:-)

Nota historyczna:
Kiedyś po utworzeniu biblioteki było konieczne, aby uruchomić polecenie: ranlib ctest.a. Ten stworzył tabelę symboli w archiwum. Ranlib jest teraz wbudowany w polecenie "ar".

Uwaga dla programistów MS / Windows: "." Linux / Unix biblioteka jest koncepcyjnie taka sama jak w Visual Studio C++ statyczne biblioteki "lib".

Brak komentarzy:

Prześlij komentarz