33.80K
Category: programmingprogramming

Проект, компиляция и связывание

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
English     Русский Rules