Similar presentations:
Проект, компиляция и связывание
1.
Проект, компиляция и связывание2.
Этапы компиляции программы СиИсходный
код
Компилятор
Код
библиотеки
Объектный
код
Код Запуска
Компоновщик
Исполняемый
код
3.
Этапы компиляции программы Сикомпилятором GCC
Исходный
код
Препроцессор
Исходный
Код (со всеми
включениями)
Транслятор
Код на языке
ассемблера
Ассемблер
Объектный код
4.
Этапы компиляции программы Сикомпилятором GCC
Пример исходного кода программы app:
#include <stdio.h>
#define STR "This is a string"
#define MAX 3
int main( void )
{
for (int i = 0; i < MAX; i++)
{
puts(STR); // Вывод строк на экран
}
return 0; // завершение программы
}
5.
Этапы компиляции программы Сикомпилятором GCC
Пример компиляции программы app (Windows XP):
C:\app\gcc app.c
C:\app\
Пример компиляции программы app (Linux):
user@host ~/app $gcc app.c
user@host ~/app $
6.
Этапы компиляции программы Сикомпилятором GCC
Пример выполнения программы app (Windows XP):
C:\app\a.exe
This is a string
This is a string
This is a string
C:\app\
Пример выполнения программы app (Linux):
user@host
This is a
This is a
This is a
user@host
~/app $./a.out
string
string
string
~/app $
7.
Этапы компиляции программы Сикомпилятором GCC
Пример выполнения программы app (Windows XP):
C:\app\gcc -E app.c > app.txt
C:\app\
Для просмотра содержимого файла app.txt,
можно воспользоваться любым текстовым редактором.
8.
Этапы компиляции программы Сикомпилятором GCC
Фрагмент исходного кода программы app после
обработки препроцессором:
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.c"
............
int main( void )
{
for (int i = 0; i < 3; i++)
{
puts("This is a string");
}
return 0;
}
9.
Этапы компиляции программы Сикомпилятором GCC
Пример выполнения программы app (Windows XP):
C:\app\gcc -S app.c
C:\app\
10.
Этапы компиляции программы Сикомпилятором GCC
.file
"main.c"
.def
___main;
.type
32;
.endef
.section .rdata,"dr"
.scl
2;
LC0:
.ascii "This is a test\0"
.text
.globl _main
.def
_main; .scl
2;
32;
.endef
_main:
pushl
%ebp
movl
%esp, %ebp
subl
$24, %esp
andl
$-16, %esp
movl
$0, %eax
addl
$15, %eax
addl
$15, %eax
shrl
$4, %eax
sall
$4, %eax
movl
%eax, -8(%ebp)
movl
-8(%ebp), %eax
.type
L2:
cmpl
jg
movl
call
leal
incl
jmp
$2, -4(%ebp)
L3
$LC0, (%esp)
_puts
-4(%ebp), %eax
(%eax)
L2
movl
leave
ret
.def
$0, %eax
L3:
_puts;
.scl
2;
11.
Структура файлов проекта Сиstdio.h
...
windows.h
main.c
main.o
Файлы библиотек
(.lib или .a)
app.exe
другие
файлы .h
file1.h
file2.h
file1.c
file2.c
Компиляци
я
file1.o
file2.o
Связывани
е
12.
Заголовочный файл в Сисодержит
Прототипы (объявления) функций.
Директивы #define.
Объявления структур.
Встроенные функции.
Символьные константы (определённые
ключевым словом static).
Глобальные переменные (определённые
ключевым словом static).
13.
Файл исходного кода в Сисодержит
Реализации (описания) функций.
Глобальные переменные.
14.
Пример программы app:Функции
#include <stdio.h>
(компиляция и связывание)
void func( int n ); // Прототип (объявление) функции
int main( void )// Описание (определение) функции
{
func(10);
return 0;
}
void func( int n )// Описание (определение) функции
{
15.
Функции(компиляция и связывание)
Пример компиляции программы app (Windows XP):
C:\app\gcc -c app.c
C:\app\gcc app.o -o app.exe
C:\app\
Пример компиляции программы app (Linux):
user@host ~/app $gcc -c app.c
user@host ~/app $gcc app.o -o app
user@host ~/app $
16.
Функции (раздельная компиляция исвязывание)
Декомпозиция файла
исходного кода программы на
файлы (модули)
// файл file.h
#ifndef FILE_H
#define FILE_H
void func( int n );
// файл main.c
#include "file.h"
int main( void )
{
func(10);
#endif
// файл file.c
#include <stdio.h>
#include "file.h"
void func( int n )
{
int x = 20;
printf("%d", x + n);
}
17.
Функции (раздельная компиляцияи связывание)
Пример компиляции программы app (Windows XP):
C:\app\gcc -c main.c
C:\app\gcc -c func.c
C:\app\gcc main.o func.o -o app.exe
C:\app\
Пример компиляции программы app (Linux):
user@host
user@host
user@host
user@host
~/app
~/app
~/app
~/app
$gcc -c main.c
$gcc -c func.c
$gcc main.o func.o -o app
$
18.
Раздельная компиляция исвязывание
Пример компиляции программы app (Windows XP):
C:\app\gcc -c main.c
C:\app\gcc main.o -o app.exe
main.o:main.c:(.text+0x2b): undefined reference to
`_func'
collect2: return 1 exit status
C:\app\
Пример компиляции программы app (Linux):
user@host ~/app $gcc -c main.c
user@host ~/app $gcc main.o -o app
main.o: In function `main':
main.c:(.text+0xf): undefined reference to `func'
collect2: return 1 exit status
user@host ~/app $
19.
Раздельная компиляция истатическое (раннее) связывание
Windows XP
Linux
main.o
func.o
main.obj
libfunc.a
app
func.obj
libfunc.lib
app.exe
20.
Раздельная компиляция истатическое (раннее) связывание
Пример компиляции программы app (Windows XP):
C:\app\gcc -c main.c
C:\app\gcc -c func.c
C:\app\ar rc libfunc.a func.o
C:\app\ranlib libfunc.a
C:\app\gcc main.o -L. -lfunc -o app.exe
C:\app\
Пример компиляции программы app (Linux):
user@host
user@host
user@host
user@host
user@host
user@host
~/app
~/app
~/app
~/app
~/app
~/app
$gcc -c main.c
$gcc -c func.c
$ar rc libfunc.a func.o
$ranlib libfunc.a
$gcc main.o -L. -lfunc -o app
$
21.
Раздельная компиляция идинамическое (позднее) связывание
Windows XP
Linux
main.o
func.o
main.obj
func.obj
app
libfunc.so
app.exe
libfunc.dll
Исполняемые файлы и
динамические библиотеки
Исполняемые файлы и
динамические библиотеки
22.
Раздельная компиляция идинамическое (позднее) связывание
Пример компиляции программы app (Windows XP):
C:\app\gcc -c main.c
C:\app\gcc -c func.c
C:\app\gcc func.o -shared -o libfunc.dll
C:\app\gcc main.o -L. -lfunc -o app.exe
C:\app\
Пример компиляции программы app (Linux):
user@host
user@host
user@host
user@host
user@host
~/app
~/app
~/app
~/app
~/app
$gcc
$gcc
$gcc
$gcc
$
-c main.c
-fPIC -c func.c
func.o -shared -o libfunc.so
main.o -L. -lfunc -o app
23.
Структура файлов проекта Сиstdio.h
windows.h
main.c
main.o
Файлы библиотек
(.lib)
app.exe
...
другие
файлы .h
file1.h
file2.h
file1.c
file2.c
Компиляци
я
file1.obj
file2.obj
Связывани
е
libfile.dll
24.
Использование библиотекЗамена старого
библиотечного
файла новым
Общий библиотечный
файл для программ
libfile1.dll
libfile2.dll
libfile6.dll
libfile3.dll
libfile4.dll
libfile1.dll
app1.exe
app2.exe
libfile5.dll
25.
Некоторые ключи GCCОткомпилировать файл исходного кода но не связывать
-c имя_файла_исходного_кода
Получить исполняемый (библиотечный) файл с заданным именем
-o имя_создаваемого_файла
Указать место расположения
заголовочных файлов
-Iпуть
Указать место расположения
библиотечных файлов
-Lпуть
Добавить при связывании библиотеку (для статической libfile.lib → lfile и для динамической libfile.dll → -lfile)
-lимя_файла_библиотеки
Включить относительную адресацию
Position Independent Code (PIC)
Создать разделяемую
-fPIC
библиотеку
-shared