]> gitweb.morketsmerke.org Git - mmdev.git/commitdiff
Rozpoczęcie redagowania 14 rozdziału. Podrozdział 14.1.2.
authorxf0r3m <jakubstasinski@protonmaill.com>
Tue, 16 Apr 2024 16:23:16 +0000 (18:23 +0200)
committerxf0r3m <jakubstasinski@protonmaill.com>
Tue, 16 Apr 2024 16:23:16 +0000 (18:23 +0200)
articles/terminallog/Linux.Podstawy.html

index c9fc2cfccb66781fbb9ac82b447974a32fa36ff6..436ff24a3055dc427efeb010bab9124170afd4b3 100644 (file)
@@ -11296,6 +11296,228 @@ error_name=org.xfce.Xfconf.Error.PropertyNotFound reply_serial=25087
           (ang. <em>PostScript Printer Definition</em>) konkretnego urządzenia,
           aby określić takie ustawienia jak rozmiar papieru czy rozdzielczość.
         </p>
+        <h1 id="14.programmingtools">14. Narzędzia programistyczne</h1>
+        <p>
+          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.
+        </p>
+        <p>
+          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ń. 
+        </p>
+        <h2 id="14.1.ccompiler">14.1. Kompilator języka C</h2>
+        <p>
+          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). 
+        </p>
+        <p>
+          W uproszeczniu zamiana kodu źródłowego na postać wykonywalną przez
+          komputer nosi nazwę <strong>kompilacji</strong>. 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
+          <em>GNU C Compiler</em> (gcc) oraz <em>Clang/LLVM</em>. W tym
+          materiale skupimy się na klasycznym kompilatorze <em>gcc</em>.
+        </p>
+        <p>
+          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
+          <em>build-essential</em>, w przypadku rodziny dystrybucji opartych
+          o Red Hat należy użyć grupy instalacyjnej <em>Development Tools</em>.
+        </p>
+        <p>
+          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.
+        </p>
+<pre class="code-block">
+#include &lt;stdio.h&gt;
+
+int main() {
+  printf("Hello, World!\n");
+}
+</pre>
+        <p>
+          Zapisany powyżej bardzo prosty program, zapisałem z w pliku
+          <em>hello.c</em>. Pliki kodu źródłowego języka C powinny mieć
+          rozszerzenie <em>.c</em>. 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.
+        </p>
+        <p>
+          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ń <em>cc</em> lub
+          <em>gcc</em>
+        </p>
+<pre class="code-block">
+xf0r3m@vm-cac72df:~/C$ cc hello.c
+</pre>
+        <p>
+          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 <em>a.out</em>, 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:
+        </p>
+<pre class="code-block">
+xf0r3m@vm-cac72df:~/C$ ./a.out
+Hello, World!
+</pre>
+        <p>
+          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
+          <em>-o</em>.
+        </p>
+<pre class="code-block">
+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!
+</pre>
+        <h3 id="14.1.1.amanyfilecompilation">14.1.1. Kompilowanie wielu plików źródłowych</h3>
+        <p>
+          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.
+        </p>
+        <p>
+          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 <em>-c</em> w celu
+          utworzenia dla każdego ze składowych
+          <strong>plików obiektowych</strong> -  zawierających kod obiektowy,
+          który finalnie przyjmie formę pliku wykonywalnego. Załóżmy, że mam
+          tylko dwa pliki.
+        </p>
+        <p>
+          <em>main.c</em>:
+        </p>
+<pre class="code-block">
+void hello_call();
+int main() {
+  hello_call();
+}
+</pre>
+        <p>
+          <em>aux.c</em>:
+        </p>
+<pre class="code-block">
+#include &lt;stdio.h&gt;
+
+void hello_call() {
+  printf("Hello, World!\n");
+}
+</pre>
+        <p>
+          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.
+        </p>
+<pre class="code-block">
+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
+</pre>
+        <p>
+          W celu połaczenia plików obiektowych w plik wykonywalny użyjemy
+          innego narzędzia, jakim jest <strong>konsolidator</strong>. Na
+          systemach uniksowych nosi on nazwę <em>ld</em> 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ą
+          <em>linker</em>.
+        </p>
+<pre class="code-block">
+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!
+</pre>
+        <p>
+          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 <strong>make</strong>, które omówimy sobie
+          za chwilę.
+        </p>
+        <h3 id="14.1.2.linkingwithlibs">14.1.2. Konsolidacja z bibliotekami</h3>
+        <p>
+          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
+          <strong>bibliotekami</strong>, 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 <em>include</em>.
+          Biblioteki dodawane są na etapie konsolidacji, ich użycie w trakcie
+          tej czynności nazywane jest <strong>konsolidacją na bazie
+          biblioteki</strong>. 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.
+        </p>
+        <p>
+          Do wskazania bibliotek służy opcja <em>-l</em> kompilatora,
+          oczywiście jeśli znajdują się one w domyślnej lokalizacji tj.
+          <em>/lib</em> lub </em>/usr/lib</em> (chociaż w przypadku większości
+          dystrybucji jest to ten sam katalog - kiedy program typu <em>init</em>
+          to <em>systemd</em>), 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 <em>-L</em> a następnie podać jej nazwę
+          za pomocą wspomanianej już wcześniej opcji <em>-l</em>.
+        </p>
+        <p>
+          Przekazując do konsolidatora (kompilatora) informacje o bibliotekach
+          wartości opcji wraz z opcjami piszemy <strong>łącznie</strong>.
+        </p>
+<pre class="code-block">
+$ cc -o badobject badobject.o -lcurses -L/usr/junk/lib -lcrud
+</pre>
+        <p>
+          Podczas wyszukiwania bibliotek, przydatne może okazać się polecenie
+          <em>locate</em>, niestety może nie być domyślne zainstalowane w
+          systemie. Dodatkowo wywmaga ono aktualizacji bazy przy użyciu
+          polecenia <em>updatedb</em>.
+        </p>
+        <p>
+          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 <strong>standardową bibliotekę języka
+          C</strong> - <em>libc.a</em> - zawiera ona podstawowe komponenty
+          języka C, jest ona zawsze dołączana chyba, że świadomie ją
+          wykluczymy.
+        </p>
+        <h3 id="14.1.3.sharedlibraries">14.1.3. Biblioteki współużytkowane</h3>
       </div>
                        <p style="margin: 15px; padding: 0; outline: 0;">
                                2024; COPYLEFT; ALL RIGHTS REVERSED;