Tworzenie oprogramowania

Podobne dokumenty
Tworzenie oprogramowania

Konsolidacja (linking)

Automatyzacja kompilacji. Automatyzacja kompilacji 1/28

Programowanie Proceduralne

Laboratorium 2: Biblioteki statyczne i dynamiczne w języku C. mgr inż. Arkadiusz Chrobot

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Programowanie w systemie Linux. Jacek Lach Zakład Oprogramowania Instytut Informatyki Politechnika Śląska

Automatyzacja kompilacji. Automatyzacja kompilacji 1/40

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Systemy Operacyjne. Ćwiczenia

Make jest programem komputerowym automatyzującym proces kompilacji programów, na które składa się wiele zależnych od siebie plików.

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Wydział Elektrotechniki, Informatyki i Telekomunikacji. Instytut Informatyki i Elektroniki. Instrukcja do zajęć laboratoryjnych

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.

Podstawy Programowania.

Fragment wykładu z języka C ( )

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Sposoby wykrywania i usuwania błędów. Tomasz Borzyszkowski

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 25 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 38

Kompilacja i scalanie programów w linii poleceń gcc i make

Co nie powinno być umieszczane w plikach nagłówkowych:

Java jako język programowania

Podstawy programowania. Wykład 9 Preprocesor i modularna struktura programów. Krzysztof Banaś Podstawy programowania 1

Wstęp do programowania

WPROWADZENIE DO INFORMATYKI

Programowanie niskopoziomowe

Podstawy Programowania

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Programy użytkowe (utilities)

1. Kompilacja i uruchamianie programów

Podstawy informatyki

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Wprowadzenie do biblioteki klas C++

1 Zapoznanie się ze środowiskiem Xenomai.

Programowanie w C++ Wykład 10. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 10) Programowanie w C++ 1 / 21

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

PROGRAMOWANIE w C prolog

Tworzenie oprogramowania

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Podział programu na moduły

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Poprzedni wykład [ ] :

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Programy pomocnicze: diff, make, systemy rcs i cvs, debugger. Zarządzanie wersjami.

Pobieranie argumentów wiersza polecenia

Programowanie obiektowe zastosowanie języka Java SE

SYSTEMY OPERACYJNE I laboratorium 3 (Informatyka stacjonarne 2 rok, semestr zimowy)

Języki programowania obiektowego Nieobiektowe elementy języka C++

MentorGraphics ModelSim

Podstawy Informatyki Wprowadzenie do języka C dr inż. Jarosław Bułat

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Pliki. Informacje ogólne. Obsługa plików w języku C

Informatyka I : Tworzenie projektu

INSTYTUT INFORMATYKI, AUTOMATYKI I ROBOTYKI POLITECHNIKI WROCŁAWSKIEJ

Pliki. Informacje ogólne. Obsługa plików w języku C

Linux Kernel II. Hello kernel - jak napisać pierwszy moduł

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Laboratorium 0: System Linux, edytor vim i kompilator gcc. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Programowanie Systemów Wbudowanych. GNU Toolchain i kompilacja skrośna. GNU Toolchain. Cross-compilation KSEM WETI PG.

#line #endif #ifndef #pragma

Utworzenie pliku. Dowiesz się:

Laboratorium Informatyka (I) AiR Ćwiczenia z debugowania

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

System operacyjny Linux

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Zofia Kruczkiewicz, ETE8305_2 1

Programowanie Systemów Wbudowanych

Rozdział 1. Informacje ogólne

Języki i metodyka programowania. Wprowadzenie do języka C

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie w asemblerze Linkowanie

Kurs systemu Unix wykład wstępny. Kurs systemu Unix 1

WYKŁAD 1 - KONSPEKT. Program wykładu:

Uruchomienie Intel Galileo

Programowanie w językach wysokiego poziomu

Podstawy użytkowania Linux a

Programowanie mikrokontrolerów AVR

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Programowanie obiektowe

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

Znaki globalne w Linuxie

Pracownia Technik Obliczeniowych

Laboratorium 1. I. Zainstaluj program Eclipse (wersja C/C++ w odpowiednim systemie operacyjnym

Język JAVA podstawy. wykład 1, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Wstęp do Programowania, laboratorium 02

Programowanie w języku C++ Grażyna Koba

Podstawy programowania - 1

Funkcje zawarte w bibliotece < io.h >

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Formatowane (tekstowe) wejście/wyjście. Binarne wejście/wyjście.

Transkrypt:

Tworzenie oprogramowania Język C Budowa programu napisanego w języku C podział na pliki z definicjami funkcji, korzystanie z bibliotek systemowych i własnych automatyzacja kompilacji za pomocą make dzielenie projektu na części: katalogi zawierające pliki źródłowe, pliki nagłówkowe, pliki wykonywalne, pliki biblioteczne Narzędzia programisty w środowisku GNU/Linux edytory (vi, vim, mcedit, emacs,kwrite, kate, anjuta,...) kompilator: gcc inne użyteczne narzędzia: o przeszukiwanie dokumentacji (man, apropos, whatis, info, pinfo, GNOME yelp,...) o wyszukiwanie tekstu (grep i wyrażenia regularne) o porównywanie plików (diff, patch) o automatyczne tworzenie dokumentacji: (doxygene, upiększcze kodu indent,...) o debuger (gdb tekstowy, trzeba odpowiednio skompilować program, graficzne: kdbg, ddd,...) 1

Podręcznik systemowy polecenie man Sekcje 2 system calls 3 libraries 4 special, device, files (np. /dev/random, /dev/urandom) 5 file formats Użyteczne polecenia $ whereis printf printf: /usr/bin/printf /usr/include/printf.h /usr/share/man/man1/printf.1.gz /usr/share/man/man3/printf.3.gz /usr/share/man/man1p/printf.1p.gz /usr/share/man/man3p/printf.3p.gz $ man 3 printf PRINTF(3) Linux Programmer's Manual PRINTF(3) NAME printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - formatted output conversion SYNOPSIS #include <stdio.h> int printf(const char *format,...); int fprintf(file *stream, const char *format,...); int sprintf(char *str, const char *format,...); int snprintf(char *str, size_t size, const char *format,...);... DESCRIPTION The functions in the printf family produce output according to a format as described below. The functions printf and vprintf write output to stdout, the standard output stream; fprintf and vfprintf write output to the given output stream; sprintf, snprintf, vsprintf and vsnprintf write to the character string str. $ whatis printf printf printf printf [builtins] $ apropos printf fprintf [printf] printf printf printf [builtins] snprintf [printf] sprintf [printf]... $ info printf (1) - format and print data (1) - bash built-in commands, see bash(1) (1) - format and print data (1) - bash built-in commands, see bash(1) $ info --apropos printf 2

Kompilacja programu Kompilator gcc Przykład wywołania: $ gcc file1.c file2.c file3.c o prog Pełny opis opcji: man gcc Ważniejsze opcje kompilatora gcc -o filename : określa nazwę pliku wynikowego, zawierającego program gotowy do wykonania -c : kompiluj tylko do postaci obiektów (.o), nie łącz -D symbol : definiuj symbol w preprocesorze -I path : gdzie szukać plików nagłówkowych (domyślnie aktualny katalog i katalogi standardowych bibliotek) -L path : określa dodatkowy katalog przeglądany w poszukiwaniu bibliotek -l libname : określa dołączane biblioteki (np. lm oznacza bibliotekę libm.so lub libm.a, w takiej kolejności) -static : dołączaj tylko biblioteki statyczne -O n : określa stopień optymalizacji kodu wynikowego -pedantic : : wyświetl wszystkie ostrzeżenia i błędy wymagane przez standard ANSI -Wall : włącz wszystkie użyteczne ostrzeżenia -v : wyświetl komunikaty o przebiegu kompilacji -std : określa używany standard języka C (np. C99 ) 3

Kompilacja programu za pomocą make Zasada: plik Makefile zawiera cele (ang. targets), które chcemy osiągnąć i reguły (ang. rules) wyjaśniające jak to zrobić. Definiuje się również zależności (ang. dependents, prerequisities), określające kiedy należy ponownie zbudować dany cel. Przykład 1 $ cat p1.c #include <stdio.h> int main() { printf("witaj\n"); return 0; $ cat Makefile p1: p1.c gcc -Wall p1.c -o p1 $ make gcc -Wall p1.c -o p1 $./p1 Witaj Przykład 2 CC=gcc CFLAGS=-Wall -O2 SOURCES=p1.c OUTFILE=p1 all: $(CC) $(CFLAGS) $(SOURCES) -o $(OUTFILE) Przykład 3 CC=gcc CFLAGS=-Wall -O2 -lm SOURCES=p1.c funkcje.c OUTFILE=p1 all: $(CC) $(CFLAGS) $(SOURCES) -o $(OUTFILE) Przykład 4 CC=gcc CFLAGS=-Wall -O2 SOURCES=prog1.c mylib1.c OUTFILE=prog1 SRCDIR=./src INCDIR=./include LDFLAGS= -lm all: $(CC) $(CFLAGS) $(SRCDIR)/$(SOURCES) $(LDFLAGS) -I$(INCDIR) \ -o $(OUTFILE) 4

Przykład 5 $ ls -R..: include Makefile src./include: func.h./src: func.c main.c $ cat Makefile CC=gcc CFLAGS=-Wall -O2 SOURCES=main.c func.c #to po prostu main.o func.o, tylko krócej OBJECTS=$(SOURCES:.c=.o) OUTFILE=prog1 SRCDIR=./src INCDIR=./include LDFLAGS= -lm all: $(OBJECTS) $(CC) $(LDFLAGS) -o $(OUTFILE) $(OBJECTS) main.o: $(CC) -c $(CFLAGS) -I$(INCDIR) $(SRCDIR)/main.c func.o: $(CC) -c $(CFLAGS) -I$(INCDIR) $(SRCDIR)/func.c clean: rm -f $(OBJECTS) $(OUTFILE) $ make gcc -c -Wall -O2 -I./include./src/main.c gcc -c -Wall -O2 -I./include./src/func.c gcc -lm -o prog1 main.o func.o $ make clean rm -f main.o func.o prog1 5

Biblioteki Zbiór wstępnie skompilowanych funkcji przechowywanych w postaci plików binarnych Ogólny cel: wielokrotne wykorzystywanie kodu Standardowe biblioteki przechowywane są zazwyczaj w /lib i /usr/lib $ ls -c /lib more libnss_winbind.so.2 libnss_wins.so.2 libblkid.so.1 libblkid.so.1.0 libcom_err.so.2 libcom_err.so.2.1... $ ls -c /usr/lib libecpg.a libecpg.so libfwcompiler.so.6.3 librpm-4.3.so libselinux.so libbind.so.3.0.8 libfwbuilder.so.6.3... Rodzaje bibliotek: o biblioteka statyczna - zbiór plików obiektowych umieszczonych w jednym archiwum; linker przeszukuje archiwum i dołącza pliki obiektów do wynikowego programu o biblioteka współdzielona pliki obiektów są połączone w jeden plik, współużywany przez wiele programów; zmiana biblioteki nie wymaga ponownej kompilacji każdego programu, który z niej korzysta; większa złożoność; możliwość kolizji wersji; może być dynamicznie ładowana w czasie wykonywania programu w programie należy to zaznaczyć za pomocą odpowiednich funkcji (dlopen(),...) Nazwa biblioteki: o rozpoczyna się od lib o kończy się rozszerzeniem wskazującym rodzaj biblioteki o.a statyczna o.so współdzielona Korzystanie z biblioteki zainstalowanej w systemie: gcc prog.c o prog lm dołączy: /usr/lib/libm.so lub /usr/lib/libm.a Domyślnie dołączona zostanie biblioteka współdzielona. Jeśli istnieją obydwie biblioteki i chcemy dołączyć bibliotekę statyczną, należy użyć opcji static. Przykład: gcc static prog.c o prog lm 6

Tworzenie biblioteki statycznej Kompilacja i dołączenie do biblioteki gcc c file1.c file2.c file3.c ar cru moja_biblioteka.a file1.o file2.o file3.o o Biblioteka statyczna nazywana jest również archiwum. Opcje: r c ru s dodaj plik do archiwum utwórz archiwum, jeśli nie istnieje zastąp poprzednią wersję w archiwum jeśli jest starsza (replace) zapisz indeks plików obiektowych do archiwum Przykład: $ cat libhello.c #include <stdio.h> void print_hello(void) { printf("witam w bibliotece.\n"); $ cat libhello.h #ifndef M_HELLO #define M_HELLO void print_hello(void); #endif $ gcc -c libhello.c $ ar cru libhello.a libhello.o $ cat program.c #include "libhello.h" int main(void) { print_hello(); return 0; $ gcc program.c libhello.a -o program lub $ gcc program.c -L. lhello -o program Inne użyteczne opcje polecenia ar: -t listowanie zawartości biblioteki -d kasowanie modułu z biblioteki -xv wyciągnij moduły z biblioteki z listowaniem nazw wyciąganych modułów 7

Tworzenie biblioteki współdzielonej Kompilacja z użyciem odpowiedniej opcji (kod niezależny od adresu, pod który będzie załadowany w programie): gcc fpic c libhello.c Utworzenie biblioteki (najprostsza metoda): gcc -shared libhello.o -o libhello.so Kompilacja programu gcc L. -lhello program.c o program Uruchamianie: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../program Przykład: $ cat libhello.c #include <stdio.h> void print_hello(void) { printf("witam w bibliotece.\n"); $ cat libhello.h #ifndef M_HELLO #define M_HELLO void print_hello(void); #endif $ gcc fpic c libhello.c $ gcc -shared libhello.o -o libhello.so $ cat program.c #include "libhello.h" int main(void) { print_hello(); return 0; $ gcc program.c -L. -lhello -o program Sprawdzenie, czy można uruchomić program: $ ldd program linux-gate.so.1 => (0xffffe000) libhello.so => not found libc.so.6 => /lib/libc.so.6 (0xb7e68000) /lib/ld-linux.so.2 (0xb7fa7000) $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. $ ldd program linux-gate.so.1 => (0xffffe000) libhello.so =>./libhello.so (0xb7fac000) libc.so.6 => /lib/libc.so.6 (0xb7e6e000) /lib/ld-linux.so.2 (0xb7faf000) // Jeszcze nie! // Już można 8