Presentation is loading. Please wait.

Presentation is loading. Please wait.

CSE 251 Dr. Charles B. Owen Programming in C1 Compilation and Makefiles.

Similar presentations


Presentation on theme: "CSE 251 Dr. Charles B. Owen Programming in C1 Compilation and Makefiles."— Presentation transcript:

1 CSE 251 Dr. Charles B. Owen Programming in C1 Compilation and Makefiles

2 CSE 251 Dr. Charles B. Owen Programming in C2 Lecture Outline What is gcc? – What are the different switches available? What is a Makefile? Exercise: – Take an existing file, split it into multiple separate programs, and write a Makefile to simplify compilation of the files

3 CSE 251 Dr. Charles B. Owen Programming in C3 gcc is not a single program gcc is a conglomeration of programs that work together to make an executable file We need to know what it does and how we can better control it. In particular, we would like to be able to make multiple, separate programs which can be combined into one executable

4 CSE 251 Dr. Charles B. Owen Programming in C4 What does gcc do? C source file #include #define NumIter 5 int main() { int i; for (i=1; i<=NumIter; i++) printf(“PI^%d is %f\n”, i, pow(M_PI, i)); } code.c

5 CSE 251 Dr. Charles B. Owen Programming in C5 What does gcc do? C source file preprocessor (# commands) Expanded C code Compiler Machine Code (.o file) Linker Executable Library Files

6 CSE 251 Dr. Charles B. Owen Programming in C6 Some gcc options Preprocessing ( gcc –E code.c > code.i ) – Removes preprocessor directives (commands that start with #) – Produces code.i Don’t use directly Compiling ( gcc –o code.o –c code.i ) – Converts source code to machine language with unresolved directives – Produces the code.o binary Linking ( gcc –lm –o code code.o ) – Creates machine language exectutable – Produces the code binary by linking with the math library (-lm)

7 CSE 251 Dr. Charles B. Owen Programming in C7 C Preprocessor, cpp C source file preprocessor (# commands) Expanded C code Processes commands that are preceded with # symbols and expands the code  #include  #define  #ifdef and #ifndef

8 CSE 251 Dr. Charles B. Owen Programming in C8 #include Include header files that contain declarations necessary for compiling code – the declarations provide the proper types, but not the actual definitions (the actual code)

9 CSE 251 Dr. Charles B. Owen Programming in C9 #include #include “functions.h” int main() { double x = 1; printf(“Sinc(x) = %f\n”, Sinc(x)); } data.c double Sinc(double x); functions.h # ifndef _STDIO_H # if !defined __need_FILE && !defined __need___FILE # define _STDIO_H 1 # include __BEGIN_DECLS … stdio.h gcc –E data.c > data.i data.i is like an “expanded” C code in which the #include command is “substituted” with text from the files

10 CSE 251 Dr. Charles B. Owen Programming in C10 Example void DisplayMe(int n); #include “display.h” int main() { DisplayMe(12); } display.h main.c A

11 CSE 251 Dr. Charles B. Owen Programming in C11 Header Files We’ve been using.h files to define things from the C libraries: stdio.h, stdlib.h, stdbool.h, etc. These are called Header Files. We’re going to create our own.h files to share information between.c files.

12 CSE 251 Dr. Charles B. Owen Programming in C12 #define #defines a preprocessor variable – every place the variable occurs, the definition will be substituted as code Syntax: #define var_name var_definition –Examples: #define DEBUG 1 #define PI 3.1415926535

13 CSE 251 Dr. Charles B. Owen Programming in C13 #include #define PI 3.14157265 #define square(x) (x*x) int main() { printf("Value of PI is %f\n", PI); printf("Square of 3.5 is %f\n", square(3.5)); } preproc.c # 1 “preproc.c" # 1 " " # 1 " “ … typedef unsigned int size_t; … int main() { printf("Value of PI is %f\n", 3.14157265); printf("Square of 3.5 is %f\n", (3.5*3.5)); } gcc –E preproc.c > preproc.i preproc.i

14 CSE 251 Dr. Charles B. Owen Programming in C14 #ifdef, #ifndef, #if Surround code that might be included. Include for compilation when desired #ifdef DEBUG …. #endif #ifndef DEBUG … #endif

15 CSE 251 Dr. Charles B. Owen Programming in C15 Common use if(num == 1) { /* This is the only time we actually move a disk */ DisplayTower(tower); #if 0 printf("Press return"); fgets(cmd, sizeof(cmd), stdin); #endif MoveDisk(tower, fm, to); return; } This is a handy way to turn off a block of code without removing it. It often works better than trying to comment out the block, which may have comments already in it.

16 CSE 251 Dr. Charles B. Owen Programming in C16 Header Files #define NumDisks 6 #define NumPins 3 #include #include “hanoi.h” bool CheckDone(int tower[NumPins][NumDisks]); #include #include “hanoi.h” void DisplayTower(int tower[NumPins][NumDisks]) { … } hanoi.h: hanoi.c: display.c: I have two.c files in the same program. Both need to know NumDisks and NumPins. So, I put that information in a header file: hanoi.h

17 CSE 251 Dr. Charles B. Owen Programming in C17 Example #define NumDisks 6 #define NumPins 3 #include “hanoi.h” bool CheckDone(int tower[NumPins][NumDisks]); #if 0 bool DebugStuff(int x, int b[NumPins]); #endif hanoi.h: hanoi.c: B

18 CSE 251 Dr. Charles B. Owen Programming in C18 What would happen? #define NumDisks 6 #define NumPins 3 #include #include “solve.h” #include “hanoi.h” bool CheckDone(int tower[NumPins][NumDisks]); hanoi.h: hanoi.c: #include “hanoi.h” void Autosolve(int tower[NumPins][NumDisks]); solve.h: C

19 CSE 251 Dr. Charles B. Owen Programming in C19 Include Guards #ifndef HANOI_H #define HANOI_H #define NumDisks 6 #define NumPins 3 #endif #include #include “solve.h” #include “hanoi.h” bool CheckDone(int tower[NumPins][NumDisks]); hanoi.h: hanoi.c: #ifndef SOLVE_H #define SOLVE_H #include “hanoi.h” void Autosolve(int tower[NumPins][NumDisks]); #endif solve.h: Include Guards: Conditional compilation code that protects a section of code in a header from being compiled more than once.

20 CSE 251 Dr. Charles B. Owen Programming in C20 Compiling C source file preprocessor (# commands) Expanded C code Compiler Object Code (.o file) Compiler translates the C source code into object code – what the machine actually understands  Machine-specific Each line represents either a piece of data or a machine-level instruction  To create the assembly code: gcc -c preproc.c gcc –c code.c

21 CSE 251 Dr. Charles B. Owen Programming in C21 Linking Object file may not be directly executable – Missing some parts – Still has some names to be resolved The linker (ld) takes multiple object files (.o) and puts them together into one executable file – Resolves references to calls from one file to another Linking is important as it allows multiple, separate files to be brought together

22 CSE 251 Dr. Charles B. Owen Programming in C22 Linking C source file preprocessor gcc -E Expanded C code Machine Code (.o file) Linker Executable Library Files Compiler gcc -c gcc –lm code.o –o code

23 CSE 251 Dr. Charles B. Owen Programming in C23 Separate compilation For large, complex programs, it is a good idea to break your files into separate.c and.h files Can debug each separately, then reuse Can distribute pieces to other so they can incorporate into their code without changing their code (just link it in)

24 CSE 251 Dr. Charles B. Owen Programming in C24 Example (Separate Compilation) shapes.hshapes.cmainprog.c mainprog gcc -c shapes.c gcc –c mainprog.c gcc –lm mainprog.o shapes.o –o mainprog math.h

25 CSE 251 Dr. Charles B. Owen Programming in C25 Another way (Compile all at once) shapes.hshapes.cmainprog.c mainprog gcc –lm shapes.c mainprog.c –o mainprog math.h

26 CSE 251 Dr. Charles B. Owen Programming in C26 Controlling compilation/linking better We need a better way to control compilation – too much detail to type each time We can save time by only updating (compiling) the parts that need updating – if a.o file is OK (unchanged source), leave it. If a.c file is changed, the.o file needs to be regenerated then everything relinked

27 CSE 251 Dr. Charles B. Owen Programming in C27 Makefiles Suppose you have a program, which is made up of these 5 source files: main.c (include data.h, io.h) data.c (include data.h) data.h io.c (include io.h) io.h

28 CSE 251 Dr. Charles B. Owen Programming in C28 How to create the executable? data.c data.h main.cio.cio.h gcc -c data.c  data.o gcc -c io.c  io.o gcc -c main.c  main.o gcc main.o io.o data.o –o executable

29 CSE 251 Dr. Charles B. Owen Programming in C29 How to create the executable? data.c data.h main.cio.cio.h gcc -c data.c gcc -c io.c gcc -c main.c gcc main.o io.o data.o –o executable What if you modify data.h? Do you need to re-run gcc -c on io.c and main.c?

30 CSE 251 Dr. Charles B. Owen Programming in C30 Dependencies data.c data.h main.cio.cio.h data.omain.oio.o executable

31 CSE 251 Dr. Charles B. Owen Programming in C31 What is a Makefile? A Makefile is used with the make utility to determine which portions of a program to compile. It is basically a script that guides the make utility to choose the appropriate program files that are to be compiled and linked together

32 CSE 251 Dr. Charles B. Owen Programming in C32 If data.h is modified data.c data.h main.cio.cio.h data.omain.oio.o executable No need to re-create data.o and main.o

33 CSE 251 Dr. Charles B. Owen Programming in C33 If io.c is modified data.c data.h main.cio.cio.h data.omain.oio.o executable No need to re-create data.o and main.o

34 CSE 251 Dr. Charles B. Owen Programming in C34 #ifndef HANOI_H #define HANOI_H #define NumDisks 6 #define NumPins 3 #endif #include #include “solve.h” #include “hanoi.h” bool CheckDone(int tower[NumPins][NumDisks]); hanoi.h:hanoi.c: #ifndef SOLVE_H #define SOLVE_H #include “hanoi.h” void Autosolve(int tower[NumPins][NumDisks]); #endif solve.h: #include #include “hanoi.h” bool DisplayTower(int tower[NumPins][NumDisks]); display.c: D

35 CSE 251 Dr. Charles B. Owen Programming in C35 What is in a Makefile? file: dependency1 dependency2 command name in column1 TAB character spaces not commas

36 CSE 251 Dr. Charles B. Owen Programming in C36 What it means The first line indicates what a file depends on. That is, if any of the dependencies change, then that file must be updated – What updating means is defined in the command listed below the dependency Don’t forget the TAB character to begin the second line

37 CSE 251 Dr. Charles B. Owen Programming in C37 Dependency graph data.c data.h main.cio.cio.h data.omain.oio.o Executable (prog)

38 CSE 251 Dr. Charles B. Owen Programming in C38 Creating a Makefile data.c data.h main.cio.cio.h data.omain.oio.o Executable (prog) prog: data.o: main.o: io.o: Makefile: List the object (*.o) and executable files that make up the program

39 CSE 251 Dr. Charles B. Owen Programming in C39 Creating a Makefile data.c data.h main.cio.cio.h data.omain.oio.o Executable (prog) Makefile: First line specifies the dependencies for each object and executable files prog: data.o main.o io.o gcc –o prog data.o main.o io.o data.o: data.h data.c gcc –c data.c main.o: data.h io.h main.c gcc –c main.c io.o: io.h io.c gcc –c io.c

40 CSE 251 Dr. Charles B. Owen Programming in C40 Creating a Makefile data.c data.h main.cio.cio.h data.o main.oio.o Executable (prog) prog: data.o main.o io.o gcc –o prog data.o main.o io.o data.o: data.h data.c gcc –c data.c main.o: data.h io.h main.c gcc –c main.c io.o: io.h io.c gcc –c io.c Makefile: Second line contains the command to execute if any of the dependence files are modified

41 CSE 251 Dr. Charles B. Owen Programming in C41 Additional makefile “targets” clean: rm -rf *.o example22 Command “make clean” calls the clean command In this case, clears the.o files and the executable

42 CSE 251 Dr. Charles B. Owen Programming in C42 Usage make – To create the executable make linkedList.o – do what has to be done to make that.o file, then stop make clean – run the clean command 1


Download ppt "CSE 251 Dr. Charles B. Owen Programming in C1 Compilation and Makefiles."

Similar presentations


Ads by Google