Каталог статей
Предисловие:
В этой статье в основном рассматриваются и изучаютсяLinux
часто используемые компиляторы в среде —gcc
(скомпилированныйC
код)/g++
(скомпилированныйC++
код) общие инструкции и т. д., две основные среды для реализации программ, понимание динамических библиотек и статических библиотек и т. д.
1. Две среды для реализации программы
Реализация любой C
программы должна проходить через среду трансляции и среду исполнения .
В среде перевода он разделен на четыре части: предварительная компиляция, компиляция, сборка и компоновка . Основные задачи, которые необходимо решить на каждом этапе:
- Прекомпиляция (препроцессинг): включение заголовочных файлов, удаление комментариев, замена символов #define
- Компиляция: преобразование кода языка C в ассемблерный код
- Сборка: преобразование инструкций по сборке в двоичные инструкции
- Ссылка: объединить таблицу символов и таблицу сегментов для создания исполняемой программы
2. Как завершить gcc
gcc
Файлы, сформированные на каждом этапе, можно просмотреть с помощью различных опций команды
Формат: gcc [опция] [имя файла объекта] -o [создать имя файла]
Сначала Test.c
напишите C
код в файле:
//Test.c
#include<stdio.h>
#define N 100
//这是一段注释.....
int main()
{
int n = 0;
printf("Hello World\n");
printf("%d\n", n + N);
return 0;
}
1. Предварительная обработка
Просмотр Test.c
предварительно обработанных результатов, -E
функция опции — gcc
остановить процесс компиляции после завершения препроцессинга, -o
функция — сохранить предварительно обработанный контент в test.i
файл
gcc -E Test.c -o test.i
Как показано на рисунке, на этапе предобработки выполняется включение заголовочного файла, удаление комментария, замена #define и т.д.
2. компилировать
Затем скомпилируйте только что сгенерированный test.i
, остановитесь после компиляции и запишите результат в test.s
. gcc
Используемые варианты -S
.
gcc -S test.i -o test.s
Хоть мы и не изучили язык ассемблера, но все же смутно понимаем, что это ассемблерные коды, видно, что стадия компиляции заключается в переводе кода C в ассемблерные инструкции.
3. Компиляция
gcc
Использовались следующие опции -c
: -o
записать результаты в test.o
.
gcc -c test.s -o test.o
Как мы видим, после завершения компиляции появляются такие искаженные символы. По сути, после компиляции сгенерированный файл представляет собой бинарный файл, который используется для показа компьютеру, и мы уже не можем его понять.
4. ссылка
После завершения компиляции он переходит в стадию компоновки, а исполняемая программа будет сгенерирована после завершения компоновки test
.
gcc test.o -o Test
Но со ссылками нам нужно знать, на что они ссылаются.
Например, почему не определена функция printf
, return
... и т. д., но ее функции можно использовать?
Фактически система помещает реализацию этих функций
libc.so.6
в библиотечный файл с именем .Если нет специального обозначения, она будет искать вgcc
пути поиска системы по умолчанию , то есть ссылку на библиотечную функцию, чтобы функцию можно было реализовать , а это функция ссылки.
/usr/lib
libc.so.6
printf
3. Динамическая библиотека и статическая библиотека
Библиотеки функций обычно делятся на динамические и статические библиотеки. Разницу между ними можно понимать как разницу между частным и общественным. Так же, как нам нужно прочитать книгу «Си и указатели», есть два пути выбора. Один - купить книгу себе, а пользоваться ею можешь только ты. Пользоваться довольно удобно, но минус в том, что это стоит денег, второй - ходить в библиотеку брать книги, а ресурсы библиотеки общие для всех.
gcc
При связывании библиотеки функций вы можете выбрать статическую или динамическую ссылку.
- Статическое связывание похоже на покупку книги для себя.Только для себя это стоит денег (трата памяти).При статическом связывании весь код файла библиотеки будет добавлен в исполняемый файл, поэтому сгенерированный файл будет относительно большим.
- Динамическое связывание похоже на поход в библиотеку за книгами. Библиотека функций размещается в фиксированном месте, и любая программа, которая хочет ее использовать, может загрузить ее сама.
Linux
gcc
Динамическое связывание используется по умолчанию.
Сравните размеры файлов, созданных двумя
//采用静态链接
gcc -static Test.c -o Test_static
//默认采用动态链接
gcc Test.c -o Test
Если во время статической компоновки возникает ошибка, это может быть связано с тем, что ваша Linux
статическая библиотека языка C не установлена и должна быть установлена вручную.
//安装C语言静态库
yum install -y glibc-static
Видно, что исполняемый файл, сгенерированный по статической ссылке, больше, чем сгенерированный по динамической ссылке.
4. общие параметры gcc
Ниже приводится сводка общих параметров компилятора gcc.
-E активирует только предварительную обработку, это не создает файл, вам нужно перенаправить его в выходной файл;
-S компилировать на языке ассемблера без сборки и компоновки;
-c компилировать в объектный код;
-o вывод файла в файл;
-static Эта опция использует статическую компоновку для сгенерированного файла;
-g генерирует отладочную информацию. Отладчик GNU может использовать эту информацию; -shared Этот параметр
будет максимально использовать динамическую библиотеку, поэтому сгенерированный файл будет относительно небольшим, но для этого требуется, чтобы система использовала динамическую библиотеку .
Это конец этой статьи, текст кода не прост, пожалуйста, поддержите меня!