GCC используя резюме

концепция

GCC начиналась как программа интеграции системы Linux, используемой для компиляции C компилятора (GNU C Compiler), ток GCC не только поддерживает язык C, и, таким образом, его значение стало список аббревиатуры (GNU Compiler Collection), то есть, GNU семья компилятор значит.

 

Простая компиляция

Из этого следует небольшая программа test.c нужно для компиляции и запуска

#include <stdio.h>
 INT основной ( аннулируются ) 
{ 
    Е ( " Hello World! \ п " );
    вернуться  0 ; 
}

Введите команду компилятора

НКУ test.c 

 

На этом этапе будет выводить исполняемый файл: a.out, вы можете выполнить его ./a.out

Это автоматический команда GCC, большинство пользователей хотели бы переименовать, а затем введите необходимые для работы команды компилятора должны быть изменен следующим образом:

GCC test.c -o тест 

GCC -o тест test.c

 

Такой полученный исполняемый файл становится тест, вы можете выполнить его ./test

На самом деле, казалось бы, один шаг процесса сборки, разделить на четыре этапа, как показано ниже

 

поток Компиляция

При использовании компилятора GCC, процесс компиляции можно разбить на четыре этапа:

  1. Предварительная обработка (Pre-Processing)
  2. Обобщение (компилирование)
  3. Составление (Сборка)
  4. Ссылки (Linking)

предварительная обработка

Препроцессор (CPP) в соответствии с командой, начиная с символов # (директивы), изменить исходную программу C. Как и в hello.c #include <stdio.h> Команда сообщает системе, чтобы прочитать содержимое файла заголовка препроцессор stdio.h и вставить его непосредственно в текст программы на. Результаты получить другую программу C, обычно .i как расширение файла.

НКУ -E test.c -o test.i 或 НКУ -E test.c

  

компилировать

Следующим этапом является компиляция осуществляется на данном этапе, Gcc первым, чтобы проверить спецификацию кода, синтаксических ошибок, для того, чтобы определить код фактической работы, которую предстоит сделать, в проверке и правильно, Gcc перевести код на ассемблере , Пользователи могут использовать опцию «-S» для просмотра, эта опция только скомпилирована без компиляции, генерации коды сборки. Ассемблер очень полезен, она обеспечивает общий язык для различных языков высокого уровня различных компиляторов. Такие, как: тот же язык ассемблера выходного файла компилятор C и Fortran компиляторов, продуцируемых.

НКУ -S test.i -o test.s

 

компиляция

Test.s файл для сборки кода, сгенерированного в предыдущем разделе, газ ассемблер отвечает за это компилируется в объектные файлы

GCC -c -o test.s test.o

 

ссылка

Разъем НКУ газа предусмотрен, он отвечает за подключение всех дополнительных объектных файлов и объектных файлов, необходимых для программы, которая в конечном итоге генерировать исполняемый файл. Дополнительные цели включают статические файлы библиотек и динамически подключаемую библиотеку.

Для test.o генерируемого в предыдущем разделе, который был связан со стандартным вводом библиотеки C и выход, последнее испытание генератора

GCC test.o -o тест

Здесь, чтобы сгенерировать исполняемый тест

 

Команда и параметры компилятора

Основной формат: GCC [Options] file1 file2 ...   // если не добавлять параметров, нажмите параметры по умолчанию для того , чтобы выполнить компиляцию, сборка и эксплуатация ссылки, полученный исполняемый файл с именем a.out 
общих параметров: -E                  // только операции выполнения предварительной обработки 
     -S                  // выполняется только для компиляции операция завершена, не выполняют сборку, файл сборки генерируется (.s или .asm), сборка содержимого языка 
     -c                  // компилировать и собирать, но не ссылку , то есть только генерировать перемещаемый объектный файл (.o), двоичный файл, не производят полный исполняемый файл 
     -o имя файла         // содержимое операции выводится в файл , указанный по имени файла 
     - статический             // для поддержки динамического связывания системы, а не с помощью статических динамически подключаемых ссылок , связывающих операций 
     -g           // генерация информации о программе отладки компиляции релевантной (используются для БГД) 
     --save-Temps        // генерировать промежуточные результаты компиляции файла процесс ( в том числе документа предварительной обработки ( x.ii), код сборки (XS), целевой файл (хо) и конечный исполняемый файл)
 
     -I , в путях            // найти соответствующие заголовочные файлы в указанной директории PATH, промежуточный параметр без пробелов 
     -lxx                // где хх назначенные библиотеки, библиотеки для среды Linux, статический суффикс .a библиотеки, динамический суффиксом библиотеки. поэтому, как правило, библиотека имени libxx.a или libxx.so, такие как добавление libm.so библиотеки, с использованием параметров -lm (ОМТ и удаление суффикса II.A \ SO) 
     -L PATH             // найти каталог , указанный в соответствующем PATH файлы библиотек, которые -lxx указать библиотеку быть связаны между собой , -L указывает путь к библиотеке , чтобы найти. Путь поиска по умолчанию не указан библиотечные функции. 
     = XX -std             // указанные стандартные компиляторы языка используют 
     -Х-Language         // указывает файл для компиляции языка, а не их собственное суждение компилятором на основе расширения файла. Т.е. по умолчанию НКУ определяется с использованием языка программирования , основанный на случай расширения файла. Привет пример использует имя файла, имя исходного файла не подходит, вы должны использовать hello.c
      
     -Wall               // вывод некоторых простые ошибки и некоторые предупреждения потенциально проблемные 
     -Wextra             // предупреждения -Wall не включают выход 
     -Werror             / / предупреждения в качестве вывода ошибок
  
     -Wl, опция           // этот параметр в качестве параметра следует опция параметра линкер Л.Д. использованию 
     -Wl, RPATH = / путь / к / Библиотеке  // указывать не по умолчанию библиотеки времени выполнения поиска пути для линкера, используя бег программа составлена этот вариант, компоновщик будет указан в поисковом каталоге -rpath требуется поэтому файл библиотеки должен быть загружен в память
    
     -D имя = определение // присоединиться определение макроса, без указания четкости, то по умолчанию 1 
     -O1, -O2       // указанного компилятор уровня оптимизации, оптимизация , как правило , тем лучше, чем выше эффективность серии, но изменят оригинальные оптимизации структуры программы, что делает его трудно понять сборник 

     // Некоторые эксперименты , проведенные переполнение буфера вам могут понадобиться , когда опция 
     -fstack-Protector \ -fno стек-Protector  // ли открыть защиты стеки, защита здесь , чтобы добавить значение до обратного адреса проверки , чтобы гарантировать , что обратный адрес не уничтожается 
     ключ -z execstack                  // включить исполняемой стек, по умолчанию отключена
     // (эхо 0> / Труды / SYS / Kernel / randomize_va_space адрес рандомизации выключен, это одна команда, операция требует корень)

 

обработка заголовка

PATH -I             , // искать соответствующие заголовочные файлы в указанной директории PATH, промежуточные параметры без пробелов

 

 

обработка библиотеки Ссылки

 

Ссылка
компиляции, ссылки библиотеки по умолчанию каталог / USR / Lib && / USR / местные / Библиотека, если 64-битная система, и / USR / lib64, в противном случае вам нужно будет указать каталог библиотеки пользовательских ссылок на -L параметр.

команда

-L PATH // найти соответствующие библиотечные файлы в указанной директории PATH, что -lxx задающие библиотека быть связаны между собой , -L указывает путь к библиотеке , чтобы найти. Путь поиска по умолчанию не указан библиотечные функции. 
-lxx // где хх обозначается библиотеки, библиотеки для среды Linux, статический суффикс .a библиотеки, динамическая библиотека суффиксом .so, общая библиотека имени libxx.a или libxx.so, такие как добавление libm.so библиотека, используйте аргумент -lm (удалить LIB и суффикс .a \ SO) 
-static // для систем , которые поддерживают динамическое связывание, используют статические , а не динамическая ссылку операции ссылки ссылки

 

Запуск
после статической библиотеки, код встраиваются непосредственно в исполняемый файл, поэтому работать, вам не нужно указать статическую библиотеку,
а динамическая библиотека не является. Если динамическая библиотека каталоги библиотеки по умолчанию могут быть запущены непосредственно, если это пользовательский каталог, существует несколько способов настройки:

1, изменять переменные окружения:

экспорт LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: / Проект / Библиотека / * Проект / Библиотека пользовательского путь * /

Временно вступили в силу (после провала перезапуска)

 

2, ~ / .bashrc или ~ / .bash_profile (.bashrc файлов конфигурации Linux среда) добавить выше команду для перезапуска эффекта хранения терминала после того, как

~ CD 
LS - Al 
Vim .bashrc 
добавить переменные окружения: экспорт LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: / проект / LIB

 

 

3, отредактировать файл /etc/ld.so.conf (или создать новый каталог в /etc/ld.so.conf.d project.conf файл), добавить пользовательский динамический путь к библиотеке, а затем использовать команду LDCONFIG обновить, его эффект.

Как правило, мы можем использовать команду LDD для просмотра исполняемого файла зависит от динамической библиотеки

 

4, -L ../ Lib -Wl, -rpath = .. / Библиотека вариант

Кроме того, есть еще один способ, плюс, как -L ../ Lib -Wl, -rpath = .. / Lib вариант, вы можете указать приоритет динамической библиотеки каталогов поисковых составленных во время выполнения, когда ссылка, этот подход будет записан в динамической библиотеке путь эльфийского файла идти, даже если он не найден в первом каталоге поиска, вы также можете перейти к переменной окружения, чтобы указать путь для поиска. Самый простой способ развертывания, может динамически подключаемую библиотеку с тем же конфигурационные файлы в отдельную папку, упакованных исполняемых файлов, отправленных в эксплуатацию и техническое обслуживание бежать. Подводя итог: -rpath делает путь поиска и приоритет LD_LIBRARY_PATH в /etc/ld.so.conf, в то время как она записывается в исполняемый файл. Вы можете использовать команду LDD для просмотра динамической библиотеки и соответствующий путь к исполняемому файлу, используемому.

-Wl, опция           // этот параметр в качестве параметра следует опция параметра линкер Л.Д. использованию 
-Wl, RPATH = / путь / к / Библиотеке  // указывать не по умолчанию библиотеки времени выполнения поиска пути для линкера, используя бег программа составлена этот вариант, компоновщик будет необходимо искать в указанном каталоге , так -rpath библиотечные файлы должны быть загружены в память

 

Время выполнения DLL путь поиска Linux в порядке приоритета:

1, когда скомпилированный код объекта «-Wl, -rpath,» указан динамический поиск Путь к библиотеке (при задании множества динамической библиотеки пути поиска, путь между двоеточием «:». Запятая);

2, переменная среды LD_LIBRARY_PATH указания динамической библиотеки путь поиска;

3, файл конфигурации /etc/ld.so.conf указанный динамический путь поиска библиотек;

4, динамический поиск по умолчанию Путь к библиотеке / Пб, если 64-битная система дополнительно содержит / lib64;

5, по умолчанию динамического поиска библиотеки путь / USR / Lib, если 64-битная система дополнительно содержит / USR / lib64;

 

обнаружение ошибок

-Wall        // выводить предупреждающее сообщение

 

отладка

-g            // генерировать отлаживать информационный символ родной формат во время компиляции, или тому подобное можно использовать DDX GDB отладчик для отладки. -g делится на три уровня, по умолчанию -g2, -g3 , где вся информация отладки в дополнение к содержащий наружный -g2, дополнительно содержащий макросы , определенные в источнике

 

параметры оптимизации

-ON           // н-может быть от 0 до 3, по умолчанию, тем выше число , тем больше оптимизация, -O2 может получить лучший баланс между оптимизацией длины, времени компиляции и размер кода обычно используется, разработки и отладки рекомендуется -O0

 

Multi-файл компиляция

НКА test1 test2.c -o Test

 

 

рекомендация

отwww.cnblogs.com/zhaozhenkai/p/10888357.html