Wstęp

Wstęp

Po całej tej teorii i rozmowie zacznijmy od zbudowania kodu napisanego przez ostatnie dziewięć części tej serii. Ta część naszej serii może ci służyć, nawet jeśli nauczyłeś się C gdzie indziej, lub jeśli uważasz, że Twoja praktyczna strona rozwoju C potrzebuje trochę siły. Zobaczymy, jak zainstalować niezbędne oprogramowanie, co mówi oprogramowanie i, co najważniejsze, jak przekształcić kod w zer. Zanim zaczniemy, możesz przyjrzeć się naszym najnowszym artykułom na temat dostosowania środowiska programistycznego:

  • Wprowadzenie do redaktora Vima
  • Wprowadzenie do Emacsa
  • Dostosowywanie VIM do rozwoju
  • Dostosowywanie EMACS do rozwoju

Budowanie programu

Pamiętaj o pierwszej części naszej serii rozwoju C? Tam nakreśliliśmy podstawowy proces, który ma miejsce podczas kompilacji programu. Ale jeśli nie pracujesz w tworzeniu kompilatora lub innych naprawdę niskich poziomach, nie będziesz zainteresowany, ile instrukcji JMP wygenerowany plik asemblera ma, jeśli w ogóle. Będziesz chciał tylko wiedzieć, jak być tak wydajnym, jak to możliwe. Na tym chodzi w tej części artykułu, ale porysujemy tylko po powierzchni, ze względu na rozszerzalność tematu. Ale podstawowy programista C dowie się po przeczytaniu tego wszystkiego potrzebnego do efektywnej pracy.

Narzędzia

Oprócz wiedzy dokładnie, co chcesz osiągnąć, musisz zapoznać się z narzędziami, aby osiągnąć to, czego chcesz. I jest o wiele więcej dla narzędzi programistycznych Linux niż GCC, chociaż sam byłby wystarczający do kompilacji programów, ale byłoby to żmudne zadanie, ponieważ rozmiar projektu wzrasta. Dlatego stworzono inne instrumenty i zobaczymy tutaj, kim są i jak je zdobyć. Już więcej niż zasugerowałem, że przeczytasz instrukcję GCC, więc zakładam, że to zrobiłeś.

robić

Wyobraź sobie, że masz projekt wielopięciowy z dużą ilością plików źródłowych, pracuje. Teraz wyobraź sobie, że musisz zmodyfikować jeden plik (coś mniejszego) i dodać kod do innego pliku źródłowego. Z tego powodu byłoby bolesne odbudowanie całego projektu. Oto, dlaczego tworzono Make: Na podstawie czasu, wykrywa, które pliki należy odbudować, aby dotrzeć do żądanych wyników (pliki wykonywalne, pliki obiektów…), nazwane cele. Jeśli koncepcja nadal wygląda na mętną, nie martw się: po wyjaśnieniu Makefile i ogólnych pojęć, wszystko będzie łatwiej, chociaż zaawansowane koncepcje mogą być wywołujące ból głowy.

Make ma tę dokładną nazwę na wszystkich platformach, nad którymi pracowałem, że będąc całkiem sporo Linux Distros, *BSD i Solaris. Niezależnie od tego, jakiego menedżera pakietów używasz (jeśli istnieje), czy to apt*, mniam, zypper, pacman lub emerge, po prostu użyj odpowiedniego polecenia instalacji i uczynij jako argument i to wszystko. Innym podejściem byłoby, na dystrybucji z menedżerami opakowań, którzy mają wsparcie grupy, aby zainstalować całą grupę/wzór programistycznych C/C ++. Mówiąc o językach, chciałem tutaj obalić mit, który mówi, że MakeFiles (zestaw reguł, które składają się, aby dotrzeć do celu) jest używany tylko przez programistów C/C ++. Zło. Każdy język z kompilatorem/interpreterą, który może zostać wywołany z powłoki, może używać urządzeń Make'a. W rzeczywistości każdy projekt, który wymaga aktualizacji opartej na zależności, może wykorzystywać. Tak więc zaktualizowana definicja Makefile byłaby plik opisujący relacje i zależności między plikami projektu, w celu określenia tego, co należy zaktualizować/ponownie skompilować w przypadku, gdy jeden lub więcej plików w zmianach łańcucha zależności. Zrozumienie, w jaki sposób prace jest niezbędne dla każdego programisty C, który pracuje pod Linux lub UNIX - tak, oferuje również oferty komercyjnego, chociaż prawdopodobnie pewna wersja, która różni się od GNU Make, która jest naszym tematem. „Inna wersja” oznacza więcej niż liczby, oznacza, że ​​BSD Makefile jest niezgodne z Makefile GNU. Upewnij się, że masz zainstalowane GNU, jeśli nie jesteś na pudełku Linux.

W pierwszej części tego artykułu i niektórych kolejnych, używaliśmy i rozmawialiśmy o częściach MIRE, małego programu, który domyślnie wyświetla się wczoraj, ale robi wiele fajnych rzeczy związanych z datą/czasem. Po współpracy z autorem, Kimball Hawkins narodził się mały makefile, z którym będziemy współpracować.

Najpierw zobaczmy kilka podstaw dotyczących Makefile. Kanoniczna nazwa powinna być GnumakeFile, ale jeśli taka plik nie istnieje, szuka nazw takich jak Makefile i Makefile, w tej kolejności, a przynajmniej tak manualna strona. Nawiasem mówiąc, oczywiście powinieneś go przeczytać i przeczytać ponownie, a następnie przeczytać trochę więcej. Nie jest tak duży jak GCC i możesz nauczyć się wielu przydatnych sztuczek, które będą przydatne później. Najczęściej używaną nazwą w praktyce jest Makefile i nigdy nie widziałem żadnego źródła z plikami o nazwie GnumakeFile, prawdę mówiąc. Jeśli z różnych powodów musisz określić inną nazwę, użyj Make -f, tak:

 $ make -f myMakeFile

Oto Makefile, którego możesz użyć do kompilacji i instalacji wspomnianego programu, ponieważ nie jest jeszcze przesłany z Sourceforge. Chociaż jest to tylko program dwupiętowy - źródło i strona manpage - zobaczysz.

# Makefile do kompilacji i instalacji Uname: = $ (powłoka uname -s) cc = gcc cflags = -WALL cp = cp rm = rm rmflags = -f gzip = wersja gzip = minie -2.7.0.5 w przeszłości: Ifeq ($ (Uname), sunos) $ (cc) -dsunos $ (cflags) -o w przeszłości $ (wersja).C w przeciwnym razie $ (Cc) $ (cflags) -o według $ (wersja).C Endif All: MIST MONTAL MANINstall Instaluj: ManInstall $ (cp) na mocy zszkodowolenia/USR/Local/bin ManInstall: $ (cp) $ (wersja).Man1 w przeszłości.1 $ (gzip) w przeszłości.1 $ (cp) w przeszłości.1.GZ/usr/share/man/man1/clean: $ (rm) $ (rmflags).1.GZ deinstall: $ (rm) $ (rmflags)/usr/local/bin/yeest/usr/share/man/man1/w przeszłości1.GZ 

Jeśli przyjrzysz się uważnie powyższego kodu, już obserwujesz i nauczysz się wielu rzeczy. Komentarze zaczynają się od skrótów, a ponieważ Makefiles mogą stać się dość tajemnicze, lepiej skomentuj swoje makefile. Po drugie, możesz zadeklarować własne zmienne, a następnie dobrze je wykorzystać. Następnie przychodzi podstawowa część: cele. Te słowa, po których następuje okrężnica, nazywane są celami, a można je używać jak Make [-f MakeFile Nazwa] Target_name. Jeśli kiedykolwiek zainstalowałeś ze źródła, prawdopodobnie wpisałeś „Zrób instalację”. Cóż, „instalacja” jest jednym z celów w Makefile, a inne powszechnie używane cele obejmują „czyste”, „deinstall” lub „all”. Inną najważniejszą rzeczą jest to, że pierwszy cel jest zawsze wykonywany domyślnie, jeśli nie zostanie określony cel. W naszym przypadku, gdybym wpisał „Make”, byłby to odpowiednik „Make Make”, jak widać, co oznacza kompilację warunkową (jeśli jesteśmy na Solaris/Sunos, potrzebujemy dodatkowej flagi GCC) i utworzenia Wykonawca o nazwie „Minister”. Cele takie jak „Wszystkie” w naszym przykładzie nie robią nic samego, po prostu powiedz, że zależą od innych plików/celów, aby były aktualne. Obejrzyj składnię, a mianowicie rzeczy takie jak przestrzenie i zakładki, ponieważ Make jest całkiem pretensjonalna w takich rzeczach.

Oto krótki makefile dla projektu, który ma dwa pliki źródłowe. Nazwy plików to src1.C i SRC2.C i nazwa wykonywacza musi być wykonana. Proste, prawda?

EXEC: SRC1.o Src2.o gcc -o exec src1.o Src2.o Src1.O: Src1.c gcc -c src1.c src2.O: Src2.c gcc -c src2.C

Jedynym praktycznie stosowanym celem, który jest również domyślnym, jest „Exec”. To zależy na src1.o i Src2.o, który z kolei zależy od odpowiedniego .C Pliki. Więc jeśli zmodyfikujesz, powiedzmy, src2.c, wszystko, co musisz zrobić, to uruchom ponownie, co zauważy, że src2.C jest nowsze niż reszta i postępuje odpowiednio. Tutaj jest o wiele więcej do zrobienia, ale nie ma już miejsca. Jak zawsze zachęca się do pewnego samokształcenia, ale jeśli potrzebujesz tylko podstawowej funkcjonalności, powyższe będzie ci dobrze służyć.

Skrypt konfiguracyjny

Zwykle nie jest to nie tylko „make && zrób instalację”, ponieważ zanim te dwa istnieją krok, który generuje makefile, szczególnie przydatne w przypadku większych projektów. Zasadniczo wspomniane kontrole skryptów, które masz zainstalowane komponenty do kompilacji, ale także przyjmują różne argumenty, które pomagają zmienić miejsce docelowe zainstalowanych plików i różne inne opcje (e (e.G. Obsługa QT4 lub GTK3, obsługa plików PDF lub CBR i tak dalej). Zobaczmy krótko, o czym są te konfiguracyjne skrypty.

Zwykle nie piszesz skryptu konfiguracyjnego ręcznie. Do tego używasz Autoconf i Automake. Jak sugerują nazwy, to, co robią. Na przykład, w naszym poprzednim przykładzie z przeszłością programu, moglibyśmy użyć skryptu konfiguracyjnego, który wykrywa środowisko systemu operacyjnego i zmienia niektóre wytwarzanie zmiennych, a po tym wszystkim, co generuje makefile. Widzieliśmy, że w przeszłości sprawdza Makefile, jeśli biegamy w Sunos, a jeśli tak, dodaje flagę kompilatora. Rozszerzyłbym to, aby sprawdzić, czy pracujemy nad systemem BSD, a jeśli tak, inwuj gmake (gnU Make) zamiast natywnej marki, która jest, jak powiedzieliśmy, niekompatybilna z GNU Makefiles. Obie te rzeczy są wykonywane za pomocą Autoconf: Piszemy mały skonfiguruj.W Plik, w którym informujemy Autoconf, co musimy sprawdzić, i zwykle będziesz chciał sprawdzić więcej niż platforma OS. Może użytkownik nie ma zainstalowanego kompilatora, żadnej marki, bibliotek programistycznych, które są ważne i tak dalej. Na przykład linia, która sprawdzi istnienie czasu.H w systemowych standardowych lokalizacjach nagłówków wyglądałyby tak:

 Ac_check_headers (czas.H)

Zalecamy rozpoczęcie od aplikacji niezbyt bystrej, sprawdź zawartość źródła Tarball i przeczytaj konfigurację.w i/lub skonfiguruj.pliki prądu przemiennego. Dla tarballów, które je mają, Makefile.AM to również dobry sposób, aby zobaczyć, jak wygląda plik Automake. W tej sprawie jest kilka dobrych książek, a jedna z nich jest „zarządzanie projektami zarządzania GNU” Roberta Mecklenburga.

Wskazówki GCC i zwykłe flagi wiersza poleceń

Wiem, że instrukcja GCC jest duża i wiem, że wielu z was nawet tego nie czytało. Jestem dumny z czytania tego wszystkiego (i tak wszystko dotyczy sprzętu IA) i muszę wyznać, że potem mam ból głowy. Z drugiej strony, są pewne opcje, które powinieneś wiedzieć, nawet jeśli dowiesz się więcej.

Już spotkałeś flagę -O, która mówi GCC, co wynikowy Outfile i -C, który mówi GCC, aby nie uruchamiał linkera, tworzą. Mówiąc o tym, istnieją opcje, które kontrolują etapy, na których GCC powinien przestać wykonać. Aby zatrzymać się przed etapem montażu, po kompilacji per se, użyj -s. W tym samym duchu -e należy użyć, jeśli chcesz zatrzymać GCC zaraz po wstępnym przetwarzaniu.

Dobrą praktyką jest przestrzeganie standardu, jeśli nie w przypadku jednolitości, ale dla dobrych nawyków programowania. Jeśli jesteś w okresie formacyjnym jako programista C, wybierz standard (patrz poniżej) i postępuj zgodnie z nim. Język C został znormalizowany po raz pierwszy po Kernighan i Ritchie (RIP) opublikowali „The C Programming Language” w 1978 roku. Był to standard nieformalny, ale wkrótce nazwano K&R i szanowany. Ale teraz jest przestarzałe i nie zalecane. Później, w latach 80. i 90., ANSI i ISO opracowali oficjalny standard, C89, a następnie C99 i C11. GCC obsługuje również inne standardy, takie jak GNUxx, gdzie xx może wynosić 89 lub 99, jako przykłady. Sprawdź szczegółowe informacje, a opcją jest „-Std =”, „Egzekwowany” przez „-pedantic”.

Opcje związane z ostrzeżeniami zaczynają się od „-W”, takich jak „-wall” (mówi GCC, aby włączyli wszystkie błędy, chociaż nie są one całkowicie włączone) lub „-werror” (traktuj ostrzeżenia jako błędy, zawsze zalecane). Możesz przekazać dodatkowe argumenty do programów, które pomagają w krokach pośredników, takich jak preprocesor, asembler lub linker. Na przykład, jak przekazać opcję Linkerowi:

 $ gcc [inne opcje…] -WL,opcja [Kolejny zestaw opcji…]

Podobnie i intuicyjnie możesz użyć „wa” do asemblera i „wp” dla preprocesora. Zwróć uwagę na przecinek i białą przestrzeń, która mówi kompilatorowi, że część preprocesor/asembler/linker zakończyła. Inne przydatne rodziny opcji to „-g” i przyjaciele do debugowania, „-o” i przyjaciele do optymalizacji lub „-iinformator- Brak białej przestrzeni - aby dodać lokalizację zawierającą nagłówek.

Wniosek

Polecam poświęcenie czasu na przeczytanie tego artykułu, zabawę z przykładami, a następnie napisać własną, zwiększając złożoność.

Oto, czego możesz się spodziewać następnego:

  • I. C Opracowanie w Linux - Wprowadzenie
  • Ii. Porównanie C i innych języków programowania
  • Iii. Typy, operatorzy, zmienne
  • Iv. Kontrola przepływu
  • V. Funkcje
  • Vi. Wskaźniki i tablice
  • VII. Struktury
  • VIII. Podstawowe I/O
  • IX. Styl kodowania i zalecenia
  • X. Budowanie programu
  • Xi. Opakowanie dla Debiana i Fedory
  • XII. Uzyskanie pakietu w oficjalnych repozytoriach Debiana

Powiązane samouczki Linux:

  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Zainstaluj Arch Linux na stacji roboczej VMware
  • Samouczek debugowania GDB dla początkujących
  • Advanced Bash Regex z przykładami
  • Hung Linux System? Jak uciec do wiersza poleceń i…
  • Big Data Manipulacja dla zabawy i zysku Część 1
  • Wyrażenia regularne Pythona z przykładami
  • Pętle bash z przykładami