Okna.  Wirusy.  Laptopy.  Internet.  Biuro.  Narzędzia.  Kierowcy

Linux: Kompletny przewodnik Kolisnichenko Denis Nikołajewicz

28.2. Kompilowanie modułu

28.2. Kompilowanie modułu

Skompilujemy plik module.c. Aby to zrobić, będziesz potrzebować zainstalowanego kompilatora gcc, plików nagłówkowych i źródeł jądra. Jeśli przeczytałeś książkę aż do tego rozdziału, powinieneś mieć już zainstalowane następujące pakiety:

1. cpp - preprocesor cpp;

2. binutils - zestaw różnych narzędzi (as, gprof, ld);

3. glibc-kerheaders - pliki nagłówkowe jądra;

4. glibc-devel - pliki pomocnicze do tworzenia aplikacji przy użyciu biblioteka standardowa Z;

5. gcc - kompilator gcc.

Pozostaje tylko zainstalować pakiet kernel-source - teksty źródłowe Jądra Linuksa. Dodatkowo musisz się upewnić, że Twoje jądro obsługuje dynamicznie ładowane moduły (sekcja 20.3.2.3). Jeśli opcja Opcja Włącz obsługę modułów ładowalnych jest wyłączona, musisz to włączyć, zapisać plik konfiguracyjny jądra i przekompilować jądro.

Kompilator gcc wymaga wywołania z wieloma opcjami, dlatego dla ułatwienia naszej pracy napiszemy plik makefile (sekcja 21.2):

Lista 28.5. Plik makefile do budowy modułu

ŚCIEŻKA=/usr/include /usr/src/linux-2.4/include

MODFLAGI:= -O3 -Ściana -DLINUX -D__KERNEL__ -I$(ŚCIEŻKA)

moduł.o: moduł.c

$(CC) $(MODFLAGS) -c moduł.c

Opcje kompilatora mają następujące znaczenie:

O3: zastosowany zostanie trzeci poziom optymalizacji (dowiesz się na czym to polega systemu pomocy gcc: człowiek gcc);

Ściana: włącz wszystkie ostrzeżenia;

DLINUX: generowanie kodu dla systemu Linux;

I$(PATH): określ ścieżkę wyszukiwania plików nagłówkowych. Domyślnie kompilator szuka plików nagłówkowych w katalogu /usr/include, ale może ich tam nie być niezbędne pliki. Na przykład dla dystrybucji ALT Linux (jądro 2.4.21) pliki nagłówkowe znajdują się w katalogu /usr/include/linux-2.4.21rel-std-up.

Umieść plik makefile w tym samym katalogu co moduł.c i uruchom komendę make. Po jego uruchomieniu otrzymasz plik module.o, który będzie znajdował się w tym samym katalogu.

# moduł insmod.o

Zobaczysz komunikat Mój moduł: Starting... Ta sama wiadomość zostanie zapisana w pliku dziennika /var/log/messages .

Z książki C++ przez Hilla Murraya

1.1.2 Kompilacja Skąd pochodzi strumień wyjściowy cout i kod realizujący operację wyjściową „”? Program C++ musi zostać skompilowany, aby wygenerować kod wykonywalny. Zasadniczo proces kompilacji jest taki sam jak w C i obejmuje większość danych wejściowych

Z książki Podręcznik użytkownika Fedory 8 autor

3.4.3. Kompilacja Z reguły kody źródłowe programów są dystrybuowane w formie archiwum z „podwójnym rozszerzeniem” - .tar.gz. Kod źródłowy jest zwykle rozpakowywany do katalogu /usr/src. Dlatego, aby rozpakować archiwum, należy uruchomić następujące polecenia: sucd /usr/srcgunzip Archive.tar.gztar xvf

Z książki Linux dla użytkownika autor Kostromin Wiktor Aleksiejewicz

Z księgi 200 najlepsze programy dla Linuksa autor Jaremczuk Siergiej Akimowicz

17.5.6. Kompilowanie modułów Jeżeli skonfigurowałeś niektóre sterowniki jako osobne moduły (wybrałeś opcję „m” odpowiadając na niektóre pytania podczas konfiguracji), to musisz teraz uruchomić także polecenie make moduły, a następnie polecenie make moduły_install. W pliku Documentation/modules.txt możesz

Z książki Język programowania C# 2005 i platforma .NET 2.0. przez Troelsena Andrew

Kompilacja programów Nawet po pojawieniu się pakietów, które były już skompilowanymi programami, kompilacja od dawna pozostał i dla niektórych pozostaje głównym sposobem instalacji. Uwaga Pierwsze prekompilowane zestawy pojawiły się w

Z książki Asterisk™: Przyszłość telefonii, wydanie drugie autor Meggelen Jim Wang

Kompilacja warunkowa Kolejny zestaw dyrektyw preprocesora (#if, #elif, #else, #endif) umożliwia warunkową kompilację bloku kodu programu w oparciu o predefiniowane symbole. Klasycznym przypadkiem użycia tych dyrektyw jest identyfikacja bloków

Z książki Narzędzia sieciowe systemu Linux Smith Roderick W.

Z książki Język programowania C dla komputer osobisty autor Bochkov S. O.

Kompilowanie biblioteki libpri Biblioteki libpri nie używają programu autoconf do konfigurowania środowiska kompilacji ani okna wyboru komponentów kompilacji, ponieważ nie są one potrzebne; w ten sposób instalacja jest uproszczona. libpri ma zastosowanie różni producenci sprzęt komputerowy

Z książki Linux: kompletny przewodnik autor Kolisnichenko Denis Nikołajewicz

Kompilacja Asterisk Po skompilowaniu i zainstalowaniu pakietów zaptel i libpri (jeśli to konieczne) możesz przystąpić do instalacji Asterisk. W tej sekcji omówiono standardową instalację i przedstawiono alternatywne argumenty make, których można użyć

Z książki Programowanie w Linuksie w przykładach autor Robbinsa Arnolda

Kompilacja jądra Po skonfigurowaniu jądra systemu za pomocą polecenia make xconfig lub innego polecenia podanego na początku tego rozdziału, należy skompilować jądro i zainstalować jego moduły. Aby to zrobić, musisz uruchomić następujące polecenia:# make dep# make bzImage# make moduły# make

Z książki Język C - przewodnik dla początkujących autorstwa Praty Steven

Kompilacja warunkowa W tej sekcji opisano dyrektywy kontrolujące kompilację warunkową. Dyrektywy te umożliwiają wykluczenie dowolnej części pliku źródłowego z procesu kompilacji poprzez sprawdzenie warunków (stała

Z książki Linux oczami hakera autor Flenow Michaił Jewgienijewicz

20,5. Kompilacja jądra 20.5.1. Po co aktualizować jądro? Linux rozwija się szybciej niż jakikolwiek inny system operacyjny. Regularnie pojawiają się nowe wersje jądra, implementujące nowe funkcje. Przykładowo dystrybucja Fedory Core 4 na jądrze 2.6.11 ledwo wyszła, a stabilna wersja jest już dostępna na www.kernel.org

Z książki system operacyjny UNIX-a autor Robaczewski Andriej M.

15.2. Kompilacja do debugowania Aby użyć debugera kodu źródłowego, debugger plik wykonywalny należy skompilować z opcją kompilatora -g. Ta opcja powoduje, że kompilator osadza dodatkowe identyfikatory debugowania w kodzie obiektowym; to jest

Z książki autora

Dlaczego kompilacja? Czytelnicy, którzy używali języka BASIC, mogą zastanawiać się, dlaczego wykonanie programu wymaga tak wielu kroków. Wydaje się, że ten sposób kompilacji trwa dłużej (i w niektórych przypadkach rzeczywiście może tak być). Ale odkąd w

Z książki autora

3.8.3. Kompilowanie jądra Po zainstalowaniu z pakietu RPM otrzymujemy jądro modułowe, w którym sterowniki urządzeń można albo wkompilować do jądra, albo załadować osobno. To jądro działa wolniej, ale umożliwia aktualizację sterowników poprzez prostą wymianę

Z książki autora

Kompilacja Procedura tworzenia większości aplikacji jest ogólna i pokazana jest na rys. 2.2. Ryż. 2.2. Schemat kompilacji programu Pierwsza faza to etap kompilacji, podczas którego pliki źródłowe programu, w tym pliki nagłówkowe, są przetwarzane przez kompilator

Po co samodzielnie kompilować jądro?
Być może głównym pytaniem zadawanym podczas kompilacji jądra jest: „Dlaczego powinienem to zrobić?”
Wielu uważa to za bezsensowną stratę czasu, aby pokazać się jako mądry i zaawansowany użytkownik Linuksa. Tak naprawdę, kompilacja jądra jest bardzo ważną sprawą. Powiedzmy, że kupiłeś nowy laptop, w którym nie działa Twoja kamera internetowa. Jakie są Twoje działania? Zaglądasz do wyszukiwarki i szukasz rozwiązania problemu w tej kwestii. Dość często może się okazać, że Twoja kamera internetowa działa na bardziej nowa wersja niż twoje. Jeśli nie wiesz jaką masz wersję, wpisz w terminalu uname -r, w rezultacie otrzymasz wersję jądra (na przykład linux-2.6.31-10). Kompilacja jądra jest również szeroko stosowana w celu zwiększenia wydajności: faktem jest, że dystrybucje jądra domyślnie kompilują się „dla wszystkich”, dlatego zawiera ogromną liczbę sterowników, których możesz nie potrzebować. Jeśli więc dobrze znasz sprzęt, którego używasz, możesz wyłączyć niepotrzebne sterowniki na etapie konfiguracji. Możliwe jest także włączenie obsługi większej ilości niż 4 Gigabajty BARAN bez zmiany systemowej głębi bitowej. Jeśli więc nadal potrzebujesz własnego jądra, zacznijmy kompilację!

Uzyskiwanie kodu źródłowego jądra.
Pierwszą rzeczą, którą musisz zrobić, to uzyskać kod źródłowy wymaganej wersji jądra. Zwykle musisz pobrać najnowszą stabilną wersję. Wszystko wersje oficjalne Jądra są dostępne na kernel.org. Jeśli masz już zainstalowany serwer X ( komputer domowy), następnie możesz wejść na stronę w swojej ulubionej przeglądarce i pobrać wymaganą wersję w archiwum tar.gz (skompresowane gzipem). Jeśli pracujesz w konsoli (np. nie zainstalowałeś jeszcze serwera X lub konfigurujesz serwer), możesz skorzystać z przeglądarki tekstowej (np. elinks). Możesz także użyć standardowego menedżera pobierania wget:
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.1.tar.gz
Pamiętaj jednak, że musisz znać dokładny numer wersji, której potrzebujesz.

Rozpakowywanie archiwum kodu źródłowego.
Po otrzymaniu archiwum kodu źródłowego należy rozpakować je do folderu. Można to zrobić z poziomu grafiki menedżery plików(delfin, nautilus itp.) lub przez mc. Lub użyj tradycyjnego polecenia tar:
tar -zxvf ścieżka_do_archiwum
Teraz masz folder z kodem źródłowym, przejdź do niego za pomocą polecenia cd katalog_źródłowy jądra(aby wyświetlić listę katalogów w folderze, użyj polecenia ls).

Konfiguracja jądra.
Po przejściu do katalogu źródłowego jądra należy przeprowadzić „20-minutową” konfigurację jądra. Jego celem jest pozostawienie tylko niezbędnych sterowników i funkcji. Wszystkie polecenia muszą być już wykonane jako superużytkownik.

make config - tryb konsoli konfiguratora.

make menuconfig - tryb konsoli w formie listy.

make xconfig - tryb graficzny.

Po dokonaniu niezbędnych zmian zapisz ustawienia i wyjdź z konfiguratora.

Kompilacja.
Nadszedł czas na ostatni etap montażu – kompilację. Odbywa się to za pomocą dwóch poleceń:
make && make install
Pierwsze polecenie skompiluje wszystkie pliki do kodu maszynowego, a drugie zainstaluje nowe jądro w twoim systemie.
Czekamy od 20 minut do kilku godzin (w zależności od mocy komputera). Jądro jest zainstalowane. Aby pojawił się na liście grub(2), wpisz (jako superużytkownik)
aktualizacja-grub
Teraz po ponownym uruchomieniu naciśnij „Escape”, a na liście zobaczysz nowe jądro. Jeśli jądro się nie włącza, po prostu uruchom komputer ze starym jądrem i skonfiguruj je ostrożniej.

KernelCheck - kompiluje jądro bez wchodzenia do konsoli.
pozwala na zbudowanie jądra w trybie w pełni graficznym dla Debiana i dystrybucji na nim opartych. Po uruchomieniu KernelCheck wyświetli monit najnowsze wersje jądra i poprawki oraz, za Twoją zgodą, pliki do pobrania kod źródłowy, uruchomi konfigurator graficzny. Program skompiluje jądro do pakietów .deb i zainstaluje je. Wszystko, co musisz zrobić, to zrestartować komputer.

Uwaga: W przyszłości planuję używać systemu T2 do kompilacji jądra i modułów dla Puppy. T2 jest obecnie zainstalowany do kompilacji jądra i liczne dodatkowe moduły, ale nie wersja w w tej chwili użyte w Puppy. Zamierzam przeprowadzić synchronizację w przyszłych wersjach Puppy, tak aby jądro skompilowane w T2 było używane w Puppy. Więcej informacji na temat Puppy i T2 można znaleźć na stronie http://www.puppyos.net/pfs/.

Puppy ma bardzo prosty sposób korzystania z kompilatorów C/C++ poprzez dodanie pojedynczego pliku devx_xxx.sfs, gdzie xxx to numer wersji. Na przykład Puppy 2.12 będzie miał plik rozwoju zgodności o nazwie devx_212.sfs. Podczas pracy w trybie LiveCD umieść plik devx_xxx.sfs w tej samej lokalizacji, co plik ustawień osobistych pup_save.3fs, który zwykle znajduje się w katalogu /mnt/home/. Dotyczy to również innych trybów instalacji, które mają plik pup_save.3fs. Jeśli Puppy jest zainstalowany na dysk twardy przy pełnej instalacji „Opcji 2”, w tym przypadku nie ma pliku osobistego, spójrz na strony internetowe Puppy, aby skompilować z różnymi opcjami konfiguracji, więc moduły nie są kompatybilne. Wersje te wymagają tylko jednej łatki dla squashfs. Puppy 2.12 ma jądro 2.6.18.1 i ma trzy poprawki; squashfs, domyślny poziom logowania konsoli i poprawka zamykania.

Te polecenia służące do łatania jądra są podane wyłącznie w celach samokształceniowych, ponieważ załatane jądro jest już dostępne...

Pierwszą rzeczą, którą powinieneś najpierw zrobić, jest pobranie samego jądra. Znajduje się w celu znalezienia łącza do odpowiedniej witryny pobierania. Powinno to być „starożytne” źródło dostępne na kernel.org lub jego serwerach lustrzanych.

Połącz się z Internetem, pobierz jądro do folderu /usr/src. Następnie rozpakuj:

cd / usr/ src tar -jxf linux-2.6.16.7.tar.bz2 tar -zxf linux-2.6.16.7.tar.gz

Powinieneś zobaczyć ten folder: /usr/src/linux-2.6.16.7. Następnie musisz się upewnić, że ten link wskazuje na jądro:

ln -sf linux-2.6.16.7 linux ln -sf linux-2.6.16.7 linux-2.6.9

Musisz zastosować poniższe poprawki, aby mieć dokładnie to samo źródło, które zostało użyte podczas kompilacji jądra dla Puppy. W przeciwnym razie podczas kompilacji sterownika i próby użycia go z jądrem Puppy pojawią się komunikaty o błędach „nierozwiązanych symboli”. Stosowanie poprawki do squashfs

Po drugie, zastosuj łatkę Squashfs. Poprawka Squashfs dodaje obsługę działania Squashfs system plików tylko do odczytu.

Pobierz łatkę squashfs2.1-patch-k2.6.9.gz do folderu /usr/src. Należy zauważyć, że ta poprawka została wprowadzona dla wersji jądra 2.6.9, ale nadal działa w wersjach 2.6.11.x, o ile istnieje odniesienie do linux-2.6.9. Następnie zastosuj poprawkę:

Cd/ usr/ src gunzip squashfs2.1-patch-k2.6.9.gz cd/ usr/ src/ linux-2.6.11.11

Uwaga, p1 ma cyfrę 1, a nie symbol l... (Świetny żart - ok. tłumaczenie)

łatka --praca na sucho -p1< ../ squashfs2.1-patch patch -p1 < ../ squashfs2.1-patch

Gotowy! Jądro jest gotowe do kompilacji!

Kompilacja jądra

Musisz uzyskać plik konfiguracyjny dla jądra. Jego kopia znajduje się w folderze /lib/modules.

Następnie wykonaj następujące kroki:

Cd/usr/src/linux-2.6.18.1

Jeśli istnieje plik .config, skopiuj go gdzieś tymczasowo lub zmień jego nazwę.

oczyścić, uczynić pana właściwym

Skopiuj plik .config dla Puppy do /usr/src/linux-2.6.18.1... Będzie miał różne nazwy w /lib/modules, więc zmień nazwę na .config... Poniższe kroki odczytują plik .config i generują nowy.

zrób menuconfig

...wprowadź dowolne zmiany i zapisz je. Będziesz mieć teraz nowy plik .config i powinieneś go gdzieś skopiować na przechowanie. Patrz uwaga poniżej

zrób bzImage

Teraz skompilowałeś jądro.

Świetnie, jądro Linuksa znajdziesz w /usr/src/linux-2.6.18.1/arch/i386/boot/bzImage

Kompilowanie modułów

Teraz przejdź do /lib/modules i jeśli istnieje już folder o nazwie 2.6.18.1 , zmień nazwę folderu 2.6.18.1 na 2.6.18.1-old .

Teraz zainstaluj nowe moduły:

Cd/ usr/ src/ linux-2.6.18.1 make moduły make moduły_install

...potem powinieneś znaleźć nowe moduły zainstalowane w folderze /lib/modules/2.6.18.1.

Należy pamiętać, że ostatni krok powyżej uruchamia program „depmod”, co może spowodować wyświetlenie komunikatów o błędach dotyczących brakujących symboli dla niektórych modułów. Nie przejmuj się - jeden z programistów coś schrzanił i przez to nie możemy używać tego modułu.

Jak korzystać z nowego jądra i modułów

Lepiej, jeśli masz zainstalowany Puppy Unleashed. Następnie archiwum tar zostaje rozwinięte i znajdują się w nim 2 katalogi: „boot” i „kernels”.

„Boot” zawiera strukturę pliku i skrypt do utworzenia pliku początkowego dysk wirtualny. Będziesz musiał umieścić tam kilka modułów jądra.

W katalogu „kernels” znajduje się katalog kernels/2.6.18.1/ i będziesz musiał wymienić moduły na zaktualizowane. Nie musisz go wymieniać, jeśli przekompilowałeś tę samą wersję jądra (2.6.18.1).

Zauważ, że w jądrach/2.6.18.1 znajduje się plik o nazwie „System.map”. Powinieneś zmienić jego nazwę i zastąpić ją nową z /usr/src/linux-2.6.18.1. Przeglądaj folder kernels/2.6.18.1/ i powinieneś wiedzieć, co wymaga aktualizacji.

Jeśli skompilowałeś jądro w pełnej instalacji Puppy, możesz zrestartować system, używając nowego jądra. make moduły_instalacja to powyższy krok instalowania nowych modułów w /lib/modules/2.6.18.1 , ale musisz także zainstalować nowe jądro. Uruchamiam Gruba i po prostu kopiuję nowe jądro do katalogu /boot (i zmieniam nazwę pliku z bzImage na vmlinuz).

Uwaga dotycząca menuconfig. Używam go od wieków, więc traktuj pewne rzeczy jako oczywiste, jednak nowicjusz może być zdezorientowany, chcąc opuścić program. W menu najwyższego poziomu znajduje się menu umożliwiające zapisanie konfiguracji - zignoruj ​​je. Po prostu naciśnij klawisz TAB (lub klawisz strzałki w prawo), aby podświetlić „przycisk” Wyjdź i naciśnij klawisz ENTER. Następnie zostaniesz zapytany, czy chcesz zapisać nową konfigurację, a Twoja odpowiedź powinna brzmieć Tak.

Niektóre cechy programowania modułowego i ogólne zalecenia dotyczące konstruowania podprogramów o strukturze modułowej.

Moduły są podłączane do programu głównego w kolejności, w jakiej zostały zadeklarowane UŻYCIA, i w tej samej kolejności są bloki inicjujące moduły podłączone do programu głównego przed rozpoczęciem wykonywania programu.

Kolejność wykonywania modułów może mieć wpływ na dostęp do danych bibliotecznych i dostęp rutynowy.

Przykładowo, jeśli moduły o nazwach M1, M2 zawierają ten sam typ A, zmienną B i podprogram C, to po połączeniu tych modeli USES wywołania A, B, C w tym PU będą równoznaczne z wywołaniami obiektów do modułu M2.

Aby jednak scharakteryzować poprawność wywołań niezbędnych obiektów o tej samej nazwie z różnych podłączonych modułów, wskazane jest, aby przy dostępie do modułu podać najpierw nazwę modułu, a następnie kropkę nazwę obiektu: M1. A M1.B M1.C M2.B.

Oczywiste jest, że dość łatwo jest to rozdzielić duży program na dwie części (PE), tj. program główny + moduły.

Umieszczając każdy PU w ​​swoim własnym segmencie pamięci i w swoim własnym plik dyskowy.

Wszystkie deklaracje typów, a także te zmienne, które powinny być dostępne dla poszczególnych PU (program główny i przyszłe moduły) powinny zostać umieszczone w osobnym module z pustą częścią wykonywalną. Nie należy jednak zwracać uwagi na to, że jakiś PE (np. moduł) nie korzysta ze wszystkich tych deklaracji. Część inicjująca taki moduł może zawierać operatory łączące zmienne plikowe z niestandardowymi pliki tekstowe(ASSIGN) i inicjowanie tych plików, tj. wskazując żądanie transmisji danych dla nich (RESET i REWRITE).

Pierwszą grupę innych podprogramów, np. kilka funkcji kompaktowych należy umieścić w 3 (po kolei) module, inne, np. procedury ogólnego przeznaczenia– w module 4 itd.

Rozkładając podprogramy na moduły w złożonym projekcie, należy zwrócić szczególną uwagę na kolejność i miejsce ich zapisu.

W środowisku TR istnieją narzędzia kontrolujące na różne sposoby kompilacja modułu.

Kompiluj Alt+F9 URUCHOM Cntr+F9

Pamięć celu

Tryby te różnią się jedynie sposobem komunikacji i programem głównym.

Tryb kompilacji

Kompiluje główny program lub moduł znajdujący się aktualnie w aktywnym oknie edytora. Jeśli ta PU zawiera dostęp do niestandardowych modułów użytkownika, to tryb ten wymaga obecności plików dyskowych o tej samej nazwie z rozszerzeniem ___.tpu dla każdego takiego modułu wtyczki.



Jeśli miejsce docelowe jest zapisane w pamięci, pliki te pozostają tylko w pamięci, a plik dyskowy nie jest tworzony.

Dużo łatwiej jest jednak stworzyć pliki tpu razem z kompilatorem całego programu korzystając z innych trybów, które nie wymagają ustawiania opcji Dysk jako miejsce docelowe.

Stwórz tryb

Podczas kompilacji w tym trybie w pierwszej kolejności (przed kompilacją programu głównego) dla każdego modułu sprawdzane jest:

1) Istnienie pliku tpu na dysku; jeżeli nie istnieje, to tworzony jest automatycznie poprzez kompilację kodu źródłowego modułu, tj. jego plik pas

2) Zgodność znalezionego pliku tpu z tekstem źródłowym modułu, w którym można było dokonać zmian; w przeciwnym razie plik tpu zostanie automatycznie utworzony ponownie

3) Niezmienność sekcji interfejsu modułu: jeśli uległa zmianie, wówczas wszystkie moduły (ich źródłowe pliki pas), w których ten moduł jest określony w klauzuli USES, również są rekompilowane.

Jeśli nie nastąpiły zmiany w kodach źródłowych modułów, kompilator wchodzi w interakcję z tymi plikami tpu i wykorzystuje czas kompilacji.

Tryb budowania

W przeciwieństwie do trybu Make, koniecznie wymaga obecności źródłowych plików pas; kompiluje (rekompiluje) każdy moduł i w ten sposób zapewnia uwzględnienie wszystkich zmian w tekstach plików pas. Wydłuża to czas kompilacji programu jako całości.

W przeciwieństwie do trybu kompilacji, tryby Make i Build umożliwiają rozpoczęcie kompilacji programu o strukturze modułowej z dowolnego pliku pas (nazywanego plikiem podstawowym), niezależnie od tego, który plik (lub część programu) znajduje się w aktywnym okno edytora. Aby to zrobić, w elemencie kompilacji wybierz opcję Plik podstawowy, naciśnij klawisz Enter i wpisz nazwę podstawowego pliku pas, a następnie rozpocznie się kompilacja od tego pliku.

Jeżeli plik podstawowy nie zostanie w ten sposób określony, to kompilacja w trybach Make, Build i RUN możliwa jest tylko wtedy, gdy program główny znajduje się w aktywnym oknie edytora.



Jeśli zauważysz błąd, zaznacz fragment tekstu i naciśnij Ctrl+Enter
UDZIAŁ: