19
Faculté Polytechnique Compiling under Linux

Compiling Under Linux

Embed Size (px)

DESCRIPTION

Compiling under Linux.

Citation preview

Page 1: Compiling Under Linux

Faculté Polytechnique

Compiling under Linux

Page 2: Compiling Under Linux

Université de Mons

What you need…COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

2Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

GCC CPP

BINUTILS[Ld and As]

LIBS-DEV

G++ LIBSTDC++

Page 3: Compiling Under Linux

Université de Mons

[COMMAND GCC] GNU COMPILER

COLLECTION

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

3Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

From source code (.cpp)

Trough gcc compiler(command gcc)

To machine code (.exe)

Page 4: Compiling Under Linux

Université de Mons

[COMMAND GCC]-o option: file.cfile.exe

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

4Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

COD

E C $ cat file.c

#include <stdio.h>

int main(){printf("Hello world !\n");return 0;}$ gcc -o program file.c$ ./programHello world !$

COD

E C+

+ $ cat file.cpp#include <iostream.h> int main(){cout << "Hello world !" << endl;return 0;}$ g++ -o program file.cpp$ ./programHello world !$

-o outputfile

Page 5: Compiling Under Linux

Université de Mons

[COMMAND GCC]Compiles multiple sources

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

5Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

mai

n.c $ cat main.c

#include "hello.h"

Int main (void){ hello ("world"); return 0;}

Hel

lo_f

n.c $ cat hello_fn.c

#include <stdio.h>#include "hello.h"

void hello (const char * name){ printf ("Hello, %s!\n", name);}

$ cat hello.hvoid hello (const char * name);

$ gcc -Wall main.c hello_fn.c -o newhello

Page 6: Compiling Under Linux

Université de Mons

[COMMAND GCC]-c option to create objects

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

6Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

$ gcc -Wall -c main.c main.o$ gcc -Wall -c hello_fn.c hello_fn.o$ gcc main.o hello_fn.o -o hello hello.exe

Linking step gcc uses the linker ldld = a separate program.

Page 7: Compiling Under Linux

Université de Mons

[COMMAND GCC]Link with the libraries

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

7Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

Default library: libc.a___#include <math.h> #include <stdio.h> int main (void) { double x = sqrt (2.0); printf ("The square root of 2.0 is %f\n", x); return 0;} ___$ gcc -Wall calc.c -o calc/tmp/ccbR6Ojm.o: In function `main': /tmp/ccbR6Ojm.o(.text+0x19): undefined reference to `sqrt' ___$ gcc -Wall calc.c /usr/lib/libm.a -o calc___$ ./calc The square root of 2.0 is 1.414214___$ gcc -Wall calc.c -lm -o calc

Page 8: Compiling Under Linux

Université de Mons

[COMMAND GCC]Linking order

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

8Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

$ gcc -Wall calc.c -lm -o calc (correct order)

$ gcc -Wall -lm calc.c -o calc (incorrect order) main.o: In function `main': main.o(.text+0xf): undefined reference to `sqrt'

Page 9: Compiling Under Linux

Université de Mons

[COMMAND GCC]-Wall option

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

9Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

#include <stdio.h> int main (void) { double x = pow (2.0, 3.0); printf ("Two cubed is %f\n", x); return 0; } ___$ gcc badpow.c -lm $ ./a.out Two cubed is 2.851120 (incorrect result, should be 8)___ $ gcc -Wall badpow.c -lm badpow.c: In function `main': badpow.c:6: warning: implicit declaration of function `pow'

Page 10: Compiling Under Linux

Université de Mons

[COMMAND MAKE]Functionality

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

10Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

Program

File1.o

File1.c File3.h

File2.o

File2.c

File3.o

File3.h File3.c

• Program: lot of filesgcc each time?• Makefile

• Relations between the files• Dependencies

• Make: brain

Page 11: Compiling Under Linux

Université de Mons

[COMMAND MAKE]Working

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

11Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

Program

A

B (missing)

C (up to date) D (exists)

E

F

• Make A (dates)• Creates B & D• Determines libraries and gcc arguments

for B & D• Compiles

• Advanced feature: update of files depending on other files

Page 12: Compiling Under Linux

Université de Mons

[MAKEFILE] MINIMAL MAKEFILE

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

12Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

$ make hello

target: dependances<tab> commands

hello

Main.O

Main.c Hello.h

Hello.o

Hello.c

Page 13: Compiling Under Linux

Université de Mons

[MAKEFILE] EXAMPLE

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

13Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

MAKEFILECC=gcc CFLAGS=-Wall

main: main.o hello_fn.o

clean:rm -f main main.o hello_fn.o

MAKEFirst execution

$ make

gcc -Wall -c -o main.o main.cgcc -Wall -c -o hello_fn.o hello_fn.cgcc main.o hello_fn.o -o main

$ ./mainHello, world!

MAKESecond execution

$ emacs main.c (edit the file)

$ make

gcc -Wall -c -o main.o main.cgcc main.o hello_fn.o -o main

$ ./main Hello, everyone!

DELETE$ make clean

rm -f main main.o hello_fn.o

Page 14: Compiling Under Linux

Université de Mons

[MAKEFILE] RICH MAKEFILE

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

14Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

Page 15: Compiling Under Linux

Université de Mons

[MAKEFILE]MACROS FOR FLEXIBILITY

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

15Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

Page 16: Compiling Under Linux

Université de Mons

[MAKEFILE]DIRECTIVES

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

16Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

Page 17: Compiling Under Linux

Université de Mons

[DEBUG]Working

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

17Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

gcc

Option: g

Argument:files

gdb

Page 18: Compiling Under Linux

Université de Mons

[DEBUG]Features

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

18Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

Eye "inside" the program.

GDB can:

• Start the program. • Conditionally stop the program.• Determine the cause of stop.• Change things in your program in

order to test the effect

Page 19: Compiling Under Linux

Université de Mons

[DEBUG]Example

COMPILING UNDER LINUX

COMMAND GCC -O OPTION MULTIPLES SOURCES -C OPTION LINKING WITH

LIBRARIES -WALL OPTION

COMMAND MAKE FUNCTIONALITY WORKING

MAKEFILE MINIMAL MAKEFILE EXAMPLE RICH MAKEFILE MACROS DIRECTIVES

DEBUG WORKING FEATURES EXAMPLE

19Pierre Masure | EMBEDDED LINUX: COMPILING UNDER LINUX

$ gcc -g prog.c -o prog // compiling with –g$ gdb prog core // starting the GDB(gdb) b funct // inserts a breakpoint(gdb) b prog.c:134 (gdb) r // run the debug(gdb) n // next instruction1350 if (Array1[i]!=i)(gdb) print i (gdb) l funct // source of funct (gdb) c // continue(gdb) n X // steps of n instructions[…] // error(gdb) bt // bactrace (to pile of function call) [where/up/down](gdb) l prog.c:funct // source of functq // quit