мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| soft:gcc [2025/03/17 16:45] – создано radi0dev | soft:gcc [2026/03/03 15:27] (текущий) – radi0dev | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== gcc ====== | ||
| + | |||
| + | GCC- GNU Compiler Collection | ||
| (https:// | (https:// | ||
| - | ___ | + | ===== Состав компилятора g++ ===== |
| - | ## Состав компилятора g++ | + | |
| - | - **cpp** — препроцессор | + | '' |
| - | - **as** — ассемблер | + | '' |
| - | - **g++** — компилятор | + | '' |
| - | - **ld** — линкер | + | '' |
| + | |||
| + | ===== Работа с GCC ===== | ||
| - | ___ | ||
| - | ## Работа с GCC | ||
| (https:// | (https:// | ||
| - | #### Общие опции | + | |
| - | ```shell | + | ==== Общие опции |
| + | |||
| + | <code bash> | ||
| -Dname=value # Определить имя name в компилируемой программе, | -Dname=value # Определить имя name в компилируемой программе, | ||
| -o filename # Использовать filename в качестве имени для создаваемого файла | -o filename # Использовать filename в качестве имени для создаваемого файла | ||
| -Wall # Вывод сообщений о всех предупреждениях или ошибках, | -Wall # Вывод сообщений о всех предупреждениях или ошибках, | ||
| - | ``` | + | </ |
| - | #### Остановка на промежуточной стадии | + | |
| - | ```shell | + | ==== Остановка на промежуточной стадии |
| + | |||
| + | <code bash> | ||
| -E # Остановиться после стадии препроцессирования | -E # Остановиться после стадии препроцессирования | ||
| -S # Остановиться после собственно компиляции | -S # Остановиться после собственно компиляции | ||
| -c # Компилировать или ассемблировать исходные файлы, но не линковать | -c # Компилировать или ассемблировать исходные файлы, но не линковать | ||
| - | ``` | + | </ |
| Компиляция может включать до четырех стадий: | Компиляция может включать до четырех стадий: | ||
| + | |||
| Для любого имени входного файла суффикс определяет какая компиляция требуется: | Для любого имени входного файла суффикс определяет какая компиляция требуется: | ||
| - | ```shell | + | |
| + | <code bash> | ||
| file.c | file.c | ||
| file.i | file.i | ||
| Строка 39: | Строка 49: | ||
| file.S | file.S | ||
| другие | другие | ||
| - | ``` | + | |
| - | Так же язык можно указать явно: | + | </ |
| - | Принимаются следующие языки: | + | Так же язык можно указать явно: |
| - | #### Опции, которые управляют | + | Принимаются следующие языки: |
| - | ```shell | + | |
| + | ==== Опции оптимизации ==== | ||
| + | |||
| + | <code bash> | ||
| -O0 # Не оптимизировать | -O0 # Не оптимизировать | ||
| -O1 # Оптимизировать. Оптимизированная трансляции требует несколько больше времени и несколько больше памяти для больших функций | -O1 # Оптимизировать. Оптимизированная трансляции требует несколько больше времени и несколько больше памяти для больших функций | ||
| Строка 50: | Строка 63: | ||
| # Если вы используете многочисленные -O опции с номерами или без номеров уровня, | # Если вы используете многочисленные -O опции с номерами или без номеров уровня, | ||
| - | ``` | + | </ |
| + | |||
| + | ==== Опции управления зависимостями ==== | ||
| - | #### Опции управления зависимостями | + | <code bash> |
| - | ```shell | + | |
| -lfoo # Использовать при компоновке динамическую библиотеку foo.so | -lfoo # Использовать при компоновке динамическую библиотеку foo.so | ||
| # аналогично для статической библиотеки foo.a | # аналогично для статической библиотеки foo.a | ||
| Строка 59: | Строка 73: | ||
| -Llibpath # Добавить к стандартным каталогам поиска библиотек путь libpath | -Llibpath # Добавить к стандартным каталогам поиска библиотек путь libpath | ||
| -Iincludepath # Добавить к стандартным каталогам поиска заголовочных файлов путь includepath | -Iincludepath # Добавить к стандартным каталогам поиска заголовочных файлов путь includepath | ||
| - | ``` | + | </ |
| - | Опция | + | Опция |
| | | ||
| - | Линковка. | + | Линковка. |
| | | ||
| - | Так же, как и при компиляции (a.o из a.c), нужны обе опции | + | Так же, как и при компиляции (a.o из a.c), нужны обе опции |
| + | |||
| + | Вместо '' | ||
| + | '' | ||
| + | |||
| + | ===== Примеры ===== | ||
| + | |||
| + | ==== Простая компиляция ==== | ||
| - | Вместо `-lfoo` можно прямо написать целиком путь до файла библиотеки, | ||
| - | `cc -o a a.o / | ||
| - | ___ | ||
| - | ## Примеры | ||
| - | #### Простая компиляция | ||
| Чтобы скомпилировать исходный код, необходимо компилятору gcc передать в качестве параметра исходный код (файл hello.cpp): | Чтобы скомпилировать исходный код, необходимо компилятору gcc передать в качестве параметра исходный код (файл hello.cpp): | ||
| - | ```shell | + | <code bash> |
| g++ hello.cpp -o prog | g++ hello.cpp -o prog | ||
| - | ``` | + | </ |
| - | Дополнительный необязательный параметр `-o prog` указывает, | + | Дополнительный необязательный параметр '' |
| - | #### Отдельная компиляция | + | ==== Отдельная компиляция |
| C++ допускает раздельную компиляцию, | C++ допускает раздельную компиляцию, | ||
| Строка 86: | Строка 102: | ||
| Пример раздельной компиляции и компоновки: | Пример раздельной компиляции и компоновки: | ||
| - | ```shell | + | <code bash> |
| # Скомпилируем исходные файы в объектные файлы | # Скомпилируем исходные файы в объектные файлы | ||
| g++ -c main.cpp -o main.o | g++ -c main.cpp -o main.o | ||
| Строка 93: | Строка 109: | ||
| # Линкуем объектные файлы вместе, | # Линкуем объектные файлы вместе, | ||
| g++ main.o funcs.o -o my_program | g++ main.o funcs.o -o my_program | ||
| - | ``` | + | </ |
| - | #### Создание статической библиотеки | + | |
| - | Допустим, | + | ==== Создание статической библиотеки |
| - | ```shell | + | |
| + | Допустим, | ||
| + | |||
| + | <code bash> | ||
| # компилируем | # компилируем | ||
| gcc -c first.cpp -o first.o | gcc -c first.cpp -o first.o | ||
| Строка 104: | Строка 123: | ||
| # проверим: | # проверим: | ||
| file libmy.a # вывод: libmy.a: current ar archive | file libmy.a # вывод: libmy.a: current ar archive | ||
| - | ``` | + | </ |
| - | архиватор ar - утилита " | + | |
| - | `-c < | + | архиватор ar - утилита " |
| - | `-r`: Pадает режим обновления архива, | + | '' |
| - | `-s`: Добавляет (обновляет) индекс архива. В данном случае индекс архива это таблица, | + | '' |
| + | '' | ||
| + | |||
| + | Для создания индекса архива существует специальная утилита ranlib. Библиотеку libmy.a можно было сотворить и так: | ||
| - | Для создания индекса архива существует специальная утилита ranlib. Библиотеку libmy.a можно было сотворить и так: | + | <code bash> |
| - | ```shell | + | |
| ar cr libmy.a first.o second.o | ar cr libmy.a first.o second.o | ||
| ranlib libmy.a | ranlib libmy.a | ||
| - | ``` | + | </ |
| Впрочем библиотека будет прекрасно работать и без индекса архива. | Впрочем библиотека будет прекрасно работать и без индекса архива. | ||
| - | #### Подключение статической библиотеки | + | |
| - | Допустим, | + | === Подключение статической библиотеки |
| - | ```shell | + | |
| + | Допустим, | ||
| + | |||
| + | <code bash> | ||
| gcc -Wall -c main.c # компиляция программы | gcc -Wall -c main.c # компиляция программы | ||
| gcc -o mainprog main.o -L. -llibmy # линковка программы вместе с архивом с реализациями функций | gcc -o mainprog main.o -L. -llibmy # линковка программы вместе с архивом с реализациями функций | ||
| - | ``` | + | </ |
| - | Повторю: | + | |
| - | `-L/ | + | Повторю: |
| - | `-l< | + | '' |
| + | '' | ||
| - | %% | ||
| Компиляция либы: | Компиляция либы: | ||
| - | ```cpp | + | < |
| // компиляция lib.cpp в объектный файл | // компиляция lib.cpp в объектный файл | ||
| g++ -c lib.cpp -o lib.o | g++ -c lib.cpp -o lib.o | ||
| // архивируем в статическую библиотеку | // архивируем в статическую библиотеку | ||
| ar rcs libmylib.a lib.o | ar rcs libmylib.a lib.o | ||
| - | ``` | + | </ |
| Использование либы: | Использование либы: | ||
| - | ```cpp | + | < |
| // компилим файл main с подключением либы | // компилим файл main с подключением либы | ||
| g++ main.cpp -o prog -L. -lmylib | g++ main.cpp -o prog -L. -lmylib | ||
| - | ``` | + | </ |
| Здесь: | Здесь: | ||
| - | - `-L .` указывает компилятору искать библиотеку в текущем каталоге. | + | - '' |
| - | - `-lmylib` говорит компилятору использовать библиотеку | + | - '' |
| - | Эти шаги создадут исполняемый файл | + | Эти шаги создадут исполняемый файл |
| - | Если вы хотите создать динамическую библиотеку, | + | Если вы хотите создать динамическую библиотеку, |
| - | %% | + | |
| + | |||
| + | ==== Создание динамической библиотеки ==== | ||
| - | #### Создание динамической библиотеки | ||
| Набор исходных файлов аналогичен примеру сверху. | Набор исходных файлов аналогичен примеру сверху. | ||
| - | ```shell | + | |
| + | <code bash> | ||
| gcc -fPIC -c first.cpp | gcc -fPIC -c first.cpp | ||
| gcc -fPIC -c second.cpp | gcc -fPIC -c second.cpp | ||
| gcc -shared -o libhello.so.2.4.0.5 -Wl, | gcc -shared -o libhello.so.2.4.0.5 -Wl, | ||
| - | ``` | + | </ |
| - | `-fPIC` - требует от компилятора, | + | |
| - | `-shared` - указывает | + | '' |
| - | `-Wl` - Обычно, | + | '' |
| - | `-soname` - опция линковщика (передаваемая через | + | '' |
| + | '' | ||
| - | (https:// | + | ([[https:// |
| - | #### Подключение динамической библиотеки | + | === Подключение динамической библиотеки |
| - | # | + | {{fixme}} |