Download - Compiling Under Linux
Faculté Polytechnique
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++
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)
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
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
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.
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
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'
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'
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
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
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
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
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
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
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
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
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
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