ݺߣ

ݺߣShare a Scribd company logo
Программирование на языке C++
Лекция 1
Как компилируется программа на C++?
Александр Смаль
1/7
Этап №1: препроцессор
∙ Язык препроцессора – это специальный язык
программирования, встроенный в C++.
∙ Препроцессор работает с кодом на C++ как с текстом.
∙ Команды языка препроцессора называют директивами, все
директивы начинаются со знака #.
∙ Директива #include позволяет подключать заголовочные
файлы к файлам кода.
1. #include <foo.h> — библиотечный заголовочный файл,
2. #include "bar.h" — локальный заголовочный файл.
∙ Препроцессор заменяет директиву #include "bar.h" на
содержимое файла bar.h.
2/7
Этап 2: компиляция
∙ На вход компилятору поступает код на C++ после
обработки препроцессором.
∙ Каждый файл с кодом компилируется отдельно и
независимо от других файлов с кодом.
∙ Компилируется только файлы с кодом (т.е. *.cpp).
∙ Заголовочные файлы сами по себе ни во что не
компилируются, только в составе файлов с кодом.
∙ На выходе компилятора из каждого файла с кодом
получается “объектный файл” — бинарный файл со
скомпилированным кодом (с расширением .o или .obj).
3/7
Этап 3: линковка (компоновка)
∙ На этом этапе все объектные файлы объединяются в один
исполняемый (или библиотечный) файл.
∙ При этом происходит подстановка адресов функций в
места их вызова.
void foo()
{
bar ();
}
void bar() { }
∙ По каждому объектному файлу строится таблица всех
функций, которые в нём определены.
4/7
Этап 3: линковка (компоновка)
∙ На этапе компоновки важно, что каждая функция имеет
уникальное имя.
∙ В C++ может быть две функции с одним именем, но
разными параметрами.
∙ Имена функций искажаются (mangle) таким образом, что
в их имени кодируются их параметры.
Например, компилятор GCC превратит имя функции foo
void foo(int , double) {}
в _Z3fooid.
∙ Аналогично функциям в линковке нуждаются глобальные
переменные.
5/7
Этап 3: линковка (компоновка)
∙ Точка входа — функция, вызываемая при запуске
программы. По умолчанию — это функция main:
int main ()
{
return 0;
}
или
int main(int argc , char ** argv)
{
return 0;
}
6/7
Общая схема
file1.cpp
file2.cpp
.
.
.
filen.cpp
file1.o
file2.o
.
.
.
filen.o
program
Компиляция
Линковка
7/7

More Related Content

Как компилируется программа на С++?

  • 1. Программирование на языке C++ Лекция 1 Как компилируется программа на C++? Александр Смаль 1/7
  • 2. Этап №1: препроцессор ∙ Язык препроцессора – это специальный язык программирования, встроенный в C++. ∙ Препроцессор работает с кодом на C++ как с текстом. ∙ Команды языка препроцессора называют директивами, все директивы начинаются со знака #. ∙ Директива #include позволяет подключать заголовочные файлы к файлам кода. 1. #include <foo.h> — библиотечный заголовочный файл, 2. #include "bar.h" — локальный заголовочный файл. ∙ Препроцессор заменяет директиву #include "bar.h" на содержимое файла bar.h. 2/7
  • 3. Этап 2: компиляция ∙ На вход компилятору поступает код на C++ после обработки препроцессором. ∙ Каждый файл с кодом компилируется отдельно и независимо от других файлов с кодом. ∙ Компилируется только файлы с кодом (т.е. *.cpp). ∙ Заголовочные файлы сами по себе ни во что не компилируются, только в составе файлов с кодом. ∙ На выходе компилятора из каждого файла с кодом получается “объектный файл” — бинарный файл со скомпилированным кодом (с расширением .o или .obj). 3/7
  • 4. Этап 3: линковка (компоновка) ∙ На этом этапе все объектные файлы объединяются в один исполняемый (или библиотечный) файл. ∙ При этом происходит подстановка адресов функций в места их вызова. void foo() { bar (); } void bar() { } ∙ По каждому объектному файлу строится таблица всех функций, которые в нём определены. 4/7
  • 5. Этап 3: линковка (компоновка) ∙ На этапе компоновки важно, что каждая функция имеет уникальное имя. ∙ В C++ может быть две функции с одним именем, но разными параметрами. ∙ Имена функций искажаются (mangle) таким образом, что в их имени кодируются их параметры. Например, компилятор GCC превратит имя функции foo void foo(int , double) {} в _Z3fooid. ∙ Аналогично функциям в линковке нуждаются глобальные переменные. 5/7
  • 6. Этап 3: линковка (компоновка) ∙ Точка входа — функция, вызываемая при запуске программы. По умолчанию — это функция main: int main () { return 0; } или int main(int argc , char ** argv) { return 0; } 6/7