мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| soft:gcc [2025/03/18 10:39] – удалено - внешнее изменение (Дата неизвестна) A User Not Logged in | soft:gcc [2026/03/03 15:27] (текущий) – radi0dev | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== gcc ====== | ||
| + | GCC- GNU Compiler Collection | ||
| + | |||
| + | (https:// | ||
| + | |||
| + | ===== Состав компилятора g++ ===== | ||
| + | |||
| + | '' | ||
| + | '' | ||
| + | '' | ||
| + | '' | ||
| + | |||
| + | ===== Работа с GCC ===== | ||
| + | |||
| + | (https:// | ||
| + | |||
| + | ==== Общие опции ==== | ||
| + | |||
| + | <code bash> | ||
| + | -Dname=value # Определить имя name в компилируемой программе, | ||
| + | -o filename # Использовать filename в качестве имени для создаваемого файла | ||
| + | -Wall # Вывод сообщений о всех предупреждениях или ошибках, | ||
| + | </ | ||
| + | |||
| + | ==== Остановка на промежуточной стадии ==== | ||
| + | |||
| + | <code bash> | ||
| + | -E # Остановиться после стадии препроцессирования | ||
| + | -S # Остановиться после собственно компиляции | ||
| + | -c # Компилировать или ассемблировать исходные файлы, но не линковать | ||
| + | </ | ||
| + | |||
| + | Компиляция может включать до четырех стадий: | ||
| + | |||
| + | Для любого имени входного файла суффикс определяет какая компиляция требуется: | ||
| + | |||
| + | <code bash> | ||
| + | file.c | ||
| + | file.i | ||
| + | file.ii | ||
| + | file.m | ||
| + | file.h | ||
| + | file.cc | ||
| + | file.cxx | ||
| + | file.cpp | ||
| + | file.C | ||
| + | file.s | ||
| + | file.S | ||
| + | другие | ||
| + | |||
| + | </ | ||
| + | Так же язык можно указать явно: '' | ||
| + | Принимаются следующие языки: '' | ||
| + | |||
| + | ==== Опции оптимизации ==== | ||
| + | |||
| + | <code bash> | ||
| + | -O0 # Не оптимизировать | ||
| + | -O1 # Оптимизировать. Оптимизированная трансляции требует несколько больше времени и несколько больше памяти для больших функций | ||
| + | -O2 # Оптимизирует больше. GNU CC выполняет почти все поддерживаемые оптимизации, | ||
| + | -O3 # Оптимизирует еще больше. Включает все оптимизации, | ||
| + | |||
| + | # Если вы используете многочисленные -O опции с номерами или без номеров уровня, | ||
| + | </ | ||
| + | |||
| + | ==== Опции управления зависимостями ==== | ||
| + | |||
| + | <code bash> | ||
| + | -lfoo # Использовать при компоновке динамическую библиотеку foo.so | ||
| + | # аналогично для статической библиотеки foo.a | ||
| + | -l:foo.so # Аналогично, | ||
| + | -Llibpath # Добавить к стандартным каталогам поиска библиотек путь libpath | ||
| + | -Iincludepath # Добавить к стандартным каталогам поиска заголовочных файлов путь includepath | ||
| + | </ | ||
| + | |||
| + | Опция '' | ||
| + | | ||
| + | Линковка. '' | ||
| + | | ||
| + | Так же, как и при компиляции (a.o из a.c), нужны обе опции '' | ||
| + | |||
| + | Вместо '' | ||
| + | '' | ||
| + | |||
| + | ===== Примеры ===== | ||
| + | |||
| + | ==== Простая компиляция ==== | ||
| + | |||
| + | Чтобы скомпилировать исходный код, необходимо компилятору gcc передать в качестве параметра исходный код (файл hello.cpp): | ||
| + | |||
| + | <code bash> | ||
| + | g++ hello.cpp -o prog | ||
| + | </ | ||
| + | |||
| + | Дополнительный необязательный параметр '' | ||
| + | |||
| + | ==== Отдельная компиляция ==== | ||
| + | |||
| + | C++ допускает раздельную компиляцию, | ||
| + | |||
| + | Пример раздельной компиляции и компоновки: | ||
| + | |||
| + | <code bash> | ||
| + | # Скомпилируем исходные файы в объектные файлы | ||
| + | g++ -c main.cpp -o main.o | ||
| + | g++ -c funcs.cpp -o funcs.o | ||
| + | |||
| + | # Линкуем объектные файлы вместе, | ||
| + | g++ main.o funcs.o -o my_program | ||
| + | </ | ||
| + | |||
| + | ==== Создание статической библиотеки ==== | ||
| + | |||
| + | Допустим, | ||
| + | |||
| + | <code bash> | ||
| + | # компилируем | ||
| + | gcc -c first.cpp -o first.o | ||
| + | gcc -c second.cpp -o second.o | ||
| + | # архивируем: | ||
| + | ar crs libmy.a first.o second.o | ||
| + | # проверим: | ||
| + | file libmy.a # вывод: libmy.a: current ar archive | ||
| + | </ | ||
| + | |||
| + | архиватор ar - утилита " | ||
| + | '' | ||
| + | '' | ||
| + | '' | ||
| + | |||
| + | Для создания индекса архива существует специальная утилита ranlib. Библиотеку libmy.a можно было сотворить и так: | ||
| + | |||
| + | <code bash> | ||
| + | ar cr libmy.a first.o second.o | ||
| + | ranlib libmy.a | ||
| + | </ | ||
| + | |||
| + | Впрочем библиотека будет прекрасно работать и без индекса архива. | ||
| + | |||
| + | === Подключение статической библиотеки === | ||
| + | |||
| + | Допустим, | ||
| + | |||
| + | <code bash> | ||
| + | gcc -Wall -c main.c # компиляция программы | ||
| + | gcc -o mainprog main.o -L. -llibmy # линковка программы вместе с архивом с реализациями функций | ||
| + | </ | ||
| + | |||
| + | Повторю: | ||
| + | '' | ||
| + | '' | ||
| + | |||
| + | Компиляция либы: | ||
| + | <code cpp> | ||
| + | // компиляция lib.cpp в объектный файл | ||
| + | g++ -c lib.cpp -o lib.o | ||
| + | // архивируем в статическую библиотеку | ||
| + | ar rcs libmylib.a lib.o | ||
| + | </ | ||
| + | |||
| + | Использование либы: | ||
| + | <code cpp> | ||
| + | // компилим файл main с подключением либы | ||
| + | g++ main.cpp -o prog -L. -lmylib | ||
| + | </ | ||
| + | Здесь: | ||
| + | - '' | ||
| + | - '' | ||
| + | |||
| + | Эти шаги создадут исполняемый файл '' | ||
| + | |||
| + | Если вы хотите создать динамическую библиотеку, | ||
| + | |||
| + | |||
| + | ==== Создание динамической библиотеки ==== | ||
| + | |||
| + | Набор исходных файлов аналогичен примеру сверху. | ||
| + | |||
| + | <code bash> | ||
| + | gcc -fPIC -c first.cpp | ||
| + | gcc -fPIC -c second.cpp | ||
| + | gcc -shared -o libhello.so.2.4.0.5 -Wl, | ||
| + | </ | ||
| + | |||
| + | '' | ||
| + | '' | ||
| + | '' | ||
| + | '' | ||
| + | |||
| + | ([[https:// | ||
| + | === Подключение динамической библиотеки === | ||
| + | {{fixme}} | ||