From: xf0r3m Date: Tue, 16 Apr 2024 16:23:16 +0000 (+0200) Subject: Rozpoczęcie redagowania 14 rozdziału. Podrozdział 14.1.2. X-Git-Url: https://gitweb.morketsmerke.org/?a=commitdiff_plain;h=fb75d643fb46013af221dde928c844a148d62bb4;p=mmdev.git Rozpoczęcie redagowania 14 rozdziału. Podrozdział 14.1.2. --- diff --git a/articles/terminallog/Linux.Podstawy.html b/articles/terminallog/Linux.Podstawy.html index c9fc2cf..436ff24 100644 --- a/articles/terminallog/Linux.Podstawy.html +++ b/articles/terminallog/Linux.Podstawy.html @@ -11296,6 +11296,228 @@ error_name=org.xfce.Xfconf.Error.PropertyNotFound reply_serial=25087 (ang. PostScript Printer Definition) konkretnego urządzenia, aby określić takie ustawienia jak rozmiar papieru czy rozdzielczość.

+

14. Narzędzia programistyczne

+

+ Dystrybucje Linuksa, nie wymagają do podstawowej obsługi posiadania + jakich kolwiek umiejętności programistycznych. Nie mniej jednak + ten rodzaj systemów operacyjnych jest niezwykle często wybierany + przez programistów, ze względu na swoją przejrzystość oraz obszerne + udokumnetowanie. +

+

+ Odwiedzając tę stronę czy też czytając ten materiał, za pewne + oczekujemy od naszych komputerów czegoś więcej niż wyświetlenie + żądanej strony internetowej czy odtworzenie wybranego pliku wideo. + Może nadejść taka sytuacja, w której będziemy mieli styczność z kodem + źródłowym i to nie tylko języków interpretowanych (zostaną one + omówione również) ale także języków takich jak C, C++ czy Java. + Warto zapoznać się z narzędziami programistycznymi dostępnymi w + dystrybucjach, aby czytając pliki README dostarczone do paczek z + kodem czy innej jego dokumentacji wiedzieć co się robi i być może + dostosować proces tworzenia plików wykonywalnych do własnych wymagań. +

+

14.1. Kompilator języka C

+

+ Za pomocą języka C, stworzono cały ten tematyczny obszar wokół, + które oscyluje ten materiał. Wszystkie obecnie wykorzystywane Uniksy + korzystają z języka C. Dlatego też warto wiedzieć na tym etapie, w + jaki sposób możemy uruchomić program, który dostaniem w postaci + zrozumiałej dla człowieka - w postaci kodu źródłowego (zwykłego + tekstu). +

+

+ W uproszeczniu zamiana kodu źródłowego na postać wykonywalną przez + komputer nosi nazwę kompilacji. Jednaj jak się za + chwilę okaże jest tylko połowa sukcesu (w większości przypadków). + Obecnie w dystrybucjach Linuksa dostępne są dwa kompilatory + GNU C Compiler (gcc) oraz Clang/LLVM. W tym + materiale skupimy się na klasycznym kompilatorze gcc. +

+

+ Kompilator oraz inne narzędzia programistyczne mogą domyślnie nie + występować w dystrybucjach. W przypadku Debiana czy Ubuntu wystarczy + zainstalować za pomocą domyślnego menedżera pakietów pakiet + build-essential, w przypadku rodziny dystrybucji opartych + o Red Hat należy użyć grupy instalacyjnej Development Tools. +

+

+ W celu zobrazowania będę umieszczać w przykładach bardzo proste + proste programy zapisane w języku C. Tak jak wspominałem, nie jest + wymagana umiejętność programowania w żadnym z języków. +

+
+#include <stdio.h>
+
+int main() {
+  printf("Hello, World!\n");
+}
+
+

+ Zapisany powyżej bardzo prosty program, zapisałem z w pliku + hello.c. Pliki kodu źródłowego języka C powinny mieć + rozszerzenie .c. Chociaż wiemy, że w przypadku Uniksów nie + to znaczenia, to dla utrzymania porządku w plikach, warto je pokrótce + opisać za pomocą zwykłego rozszerzenia plików. +

+

+ Aby zamienić kod źródłowy na postać niskopoziomową wykonywalną przez + nasz komputer musimy skompilować kod przy użyciu kompilatora. + Program ten może być dostępny za pomocą poleceń cc lub + gcc +

+
+xf0r3m@vm-cac72df:~/C$ cc hello.c
+
+

+ Polecenie to powinno zakończyć się, bez oznajmiania jakiego kolwiek + działania na standardowym wyjściu. Wynikiem jego pracy jest + pojawienie się tuż obok pliku a.out, który ma odpowiednii + rodzaj uprawnień, aby móc go odrazu uruchomić - jest to plik + wykonywalny efekt - działania kompilatora na powierzonym mu kodzie. + Przekonać się możemy o tym wydając poniższe polecenie: +

+
+xf0r3m@vm-cac72df:~/C$ ./a.out
+Hello, World!
+
+

+ Wcześnie uruchamiając kompilator nie podaliśmy mu poza kodem żadnych + innych informacji. Jeśli chcemy, aby nasz plik wykonywalny miał + bardziej odpowienią nazwę możemy ją podać jako wartość opcji + -o. +

+
+xf0r3m@vm-cac72df:~/C$ cc -o hello hello.c
+xf0r3m@vm-cac72df:~/C$ ls
+a.out  hello  hello.c
+xf0r3m@vm-cac72df:~/C$ ./hello
+Hello, World!
+
+

14.1.1. Kompilowanie wielu plików źródłowych

+

+ W przypadku pojednyczych programów takie działanie może wystarczyć, + jednak rzadko się zdarza, aby programy były pojedynczymi plikami + kodu źródłowego, zazwyczaj zawierają go znacznie, znacznie więcej. + Sama praca z pojedyncz plikiem, może być niepożądana przez + programistów jak i kompilatory mogą mieć problem z ich + przetworzeniem. +

+

+ Główne składowe programów są najczęściej grupowane a w pojedynczych + plikach umieszcza się ich poszczególne elementy. Kompilator również + wygląda nieco inaczej. Wymagane jest użycie opcji -c w celu + utworzenia dla każdego ze składowych + plików obiektowych - zawierających kod obiektowy, + który finalnie przyjmie formę pliku wykonywalnego. Załóżmy, że mam + tylko dwa pliki. +

+

+ main.c: +

+
+void hello_call();
+int main() {
+  hello_call();
+}
+
+

+ aux.c: +

+
+#include <stdio.h>
+
+void hello_call() {
+  printf("Hello, World!\n");
+}
+
+

+ Teraz dla każdego z plików źródłowych, musimy wygenerować pliki + obiektowe. Pliki obiektowe są teoretycznie plikami wykonywalnymi + ale brakuje w nich informacji pozwalających na dokończenie + kompilacji. Sam system nie wie jak ma uruchomić pliki obiektowe, + zazwyczaj na jeden program składa się wiele plików obiektowych. +

+
+xf0r3m@vm-cac72df:~/C$ cc -c main.c
+xf0r3m@vm-cac72df:~/C$ cc -c aux.c
+xf0r3m@vm-cac72df:~/C$ ls
+aux.c  aux.o  main.c  main.o
+
+

+ W celu połaczenia plików obiektowych w plik wykonywalny użyjemy + innego narzędzia, jakim jest konsolidator. Na + systemach uniksowych nosi on nazwę ld i rzadko jest + uruchamiany przez programistów samodzielnie. Kompilator wie w jaki + sposób należy go uruchomić, dlatego też skorzystamy z jego pomocy. + Mimo tego, że będziemy używać innego narzędzia to polecenie + pozostaje to samo. Konsolidator może również występować pod nazwą + linker. +

+
+xf0r3m@vm-cac72df:~/C$ cc -o myprog main.o aux.o
+xf0r3m@vm-cac72df:~/C$ ls
+aux.c  aux.o  main.c  main.o  myprog
+xf0r3m@vm-cac72df:~/C$ ./myprog
+Hello, World!
+
+

+ Dla celów dydaktycznych stworzyliśmy program składający z dwóch + plików kodu źródłowego, zwykle jednak jest tego o wiele wiele więcej. + Tutaj poszczególne czynności wykonaliśmy ręcznie. Jeśli w przypadku + normalnego programu mielibyś to robić w ten sposób, zajęło by to + masę czasu. Na szczęście nie trzeba robić tego ręcznie. Wykorzystamy + do tego narzędzie GNU make, które omówimy sobie + za chwilę. +

+

14.1.2. Konsolidacja z bibliotekami

+

+ Obecne systemy do utworzenia pełnoprawnego programu z plików + obiektowych wymagają zbiorów wcześniej skompilowanych komponentów. + Pliki obiektowe zawierające te zestawy nie są niczym innym jak + bibliotekami, a w ich skład poza wspomnianymi już + plikami wchodzą również pliki nagłówkowego, których używaliśmy już + w kodzie programów przy użyciu dyrektywy include. + Biblioteki dodawane są na etapie konsolidacji, ich użycie w trakcie + tej czynności nazywane jest konsolidacją na bazie + biblioteki. W przypadku kiedy podczas konsolidacji + zapomnimy wspomnieć o bibliotece konsolidatorowi to zostaniem nam + zwrócony błąd. Chociaż błedy związane z niewłaściwym odwołaniem się + do biblioteki, może nie wynikać z naszych ustawień konsolidatora. + Może to również być wynikiem braku zainstalownych w systemie. +

+

+ Do wskazania bibliotek służy opcja -l kompilatora, + oczywiście jeśli znajdują się one w domyślnej lokalizacji tj. + /lib lub /usr/lib (chociaż w przypadku większości + dystrybucji jest to ten sam katalog - kiedy program typu init + to systemd), wystarczy podać jej nazwę. W przeciwnym razie + musimy na początku wskazać ścieżkę, na której można znaleźć tą + bibliotekę - za pomocą opcji -L a następnie podać jej nazwę + za pomocą wspomanianej już wcześniej opcji -l. +

+

+ Przekazując do konsolidatora (kompilatora) informacje o bibliotekach + wartości opcji wraz z opcjami piszemy łącznie. +

+
+$ cc -o badobject badobject.o -lcurses -L/usr/junk/lib -lcrud
+
+

+ Podczas wyszukiwania bibliotek, przydatne może okazać się polecenie + locate, niestety może nie być domyślne zainstalowane w + systemie. Dodatkowo wywmaga ono aktualizacji bazy przy użyciu + polecenia updatedb. +

+

+ Nasze proste programiki z przykładów, nie są pozbawione bibliotek. + Tak jak już wcześnie wspominałem kompilator nie jest wstanie utworzyć + pełnoprawnego pliku wykonywalnego. Konsolidator zawsze dołącza do + utworzonego pliku obiektowego standardową bibliotekę języka + C - libc.a - zawiera ona podstawowe komponenty + języka C, jest ona zawsze dołączana chyba, że świadomie ją + wykluczymy. +

+

14.1.3. Biblioteki współużytkowane

2024; COPYLEFT; ALL RIGHTS REVERSED;