Опції gcc, про які варто знати

Липень 16th, 2008

Використання консольного GCC – страшний нічний кошмар для новачків, що звикли до зручних графічних середовищ програмування у Windows. Величезна кількість опцій командного рядка лякає навіть відчайдухів, які відкривають man в надії знайти рішення проблеми. В цій замітці я коротко опишу найцікавіші опції GCC, про які варто знати усім.

Типовий синтаксис виклику компілятора такий:

gcc <опція> <файл з текстом програми>

Всі опції, перераховані нижче, чуливі до регістру. Наприклад, -v має геть інше значення, ніж -V. Крім того, не варто записувати опції поряд, краще окремо. -vc це зовсім не те ж, що -v -c.

Слід пам’ятати, що розширення файлу має значення. За ним визначається тип файлу, як саме його треба компілювати. Приклади:

  1. *.c – файл з програмою на С. Такі файли обробляються, компілюються і переводяся на мову асемблера
  2. *.m – файл з кодом мовою Objective-C, в нас не дуже поширеною. Обробляється так само, як і *.с
  3. *.i – вже оброблений (pre-processed) файл з програмою на С. Такий файл готовий до компіляції і лінкування.

Загальні опції

-x [c, c++, objective-c і т.д.]. – Файл буде скомпільовано з урахуванням вказаної мови. Файл з розширенням *.m можна скомпілювати як файл з програмою на чистому С, якщо вказати gcc -x c filename.m. Якщо мову не вказано, тип файлу визначається за його розширенням.

-c : Компіляція без лінкування. Буде створено так званий об’єктний файл (з розширенням “*.o”). Як правило, цією опцією користуються, коли пишуть make-файли

-S : після компіляції згенерувати асемблерний код (у вигляді тексту). Буде згенеровано щось на зразок
main:
pushl %ebp
movl %esp,%ebp
subl $8,%esp
addl $-12,%esp
pushl $.LC0

-o . Відкомпільований файл буде збережено з заданим ім’ям. Якщо цього не вказати, результат компіляції буде збережено як a.out у цій же директорії

-v : виводить інформацію про версію компілятора. Іноді, коли виникає якась невідома помилка, варто перевірити, чи не застаріла версія компілятора.

-pipe. При обробці великих програм компілятор створює тимчасові файли для збереження певної інформації. Коли вказана ця опція, файли не створюються, а дані передаються по спеціально організованих каналах. Компіляція відбувається швидше, але потребує більше оперативної пам’яті. Хоча, поки в програмі менше тисячі рядків, різниці ви все одно не помітите ;)

-ansi Буде відключено елементи gnu C, які є несумісними зі стандартом ANSI C. Втім, це ще не гарантує, що всі не властиві ANSI особливості синтаксису буде заблоковано. Наприклад, деякі речі з Turbo C все ще будуть діяти. Щоб досягти повної сумісності з ANSI, треба використовувати опцію -pedantic.

-freestanding заборона використання системних бібліотек. З цією опцією компілюється ядро ОС, користувацьким програмам вона не потрібна.

-funsigned-char. Якщо вказано, всі змінні типу char будуть оброблятися як unsigned char. Оскільки тип char є платформозалежним, варто вказувати цю опцію, щоб уникнути помилок, які, як правило, дуже важко виловлюються.

Опції препроцесора


-E : буде виконано тільки попередню обробку, без компіляції і лінкування. Деякі інші опції, зокрема -imacros , вимагають обов’якового вказування -E. Опція знадобиться, коли треба буде перевірити, чи правильно написані макроси.

-include : Спочатку буде зкомпільовано вказаний файл. Опції -D та -U будуть оброблені ще раніше. Якщо вказано кілька файлів, вони будуть оброблені в порядку, як були перелічені у командному рядку.

-C : не відкидати коментарі (використовується разом з -E)

-P : не генерувати команди “#line” (використовується разом з -E)

-M або -MM : на стандартний вивід буде виведено імена файлів, потрібних для компіляції. Тобто, тих файлів, що включені за допомогою директиви “#include”. Якщо вказати -MM, файли з системних директорій (типу “#include “) не будуть вказуватись. Опція використовується при написанні make-файлів

Опції лінкера

-l. Використовувати бінарну бібліотеку, назва якої задається значенням додатку. Зверніть увагу, між буквою l і назвою додатку немає пробілу. GCC виконає пошук файлу lib<вказана назва бібліотеки>.a. Наприклад при команді “gcc prog.c -lpthread” GCC спробує знайти файл libpthread.a у звичайних системних директоріях, а також у директоріях, на які вказано за допомогою опції -L

-L : Дозволяє вказати додаткові каталоги для пошуку бібліотек.

Вказування директорій

-I : дозволяє вказати директорію, в якій слід шукати підключені (included) файли

-I- : Звичайно пошук у директоріях, вказаних за допомогою -I буде проводитися лише в тому випадку, коли файл підключено за директивою #include "somefile.h” (назва файлу у лапках, тобто це файл користувача). Якщо ж вказати -I-, тоді всі вказані за допомогою -I директорії, будуть перевірятись також на наявність в них системних файлів (таких, які були підключені директивою з ім’ям файлу у кутових дужках, як "#include “).

Контроль попереджень (warnings)

-w не видавати попереджень

-W виводити додаткові попередження (такі, які за замовчуванням не виводяться)

-Wall виводити майже всі можливі попередження

Взагалі, конструкція -W дозволяє увімкнути генерування попередження для певного випадку. Наприклад, -Wshadow генерує попередження у випадку, коли одна локальна змінна закриває іншу, -Wunused попедеджає про змінні, які не використовуються, і т.д. Докладніше – у документації.

Особливості генерування коду

-g : Додавати у бінарний файл відладочну інформацію. Ця інформація буде потрібна для використання GNU Debugger (GDB). Насправді, це найпростіший випадок використання цілої множини опцій. -g вказує, в якому скільки і в якому форматі зберігати відлагоджувальну інформацію. Наприклад, gdwarf2 буде використовувати для запису формат DWARF.

-O : Зазначення рівню оптимізації. 0 – ніякої, 4 – найкраща. Якщо вказати просто -O, це буде те ж саме що й -O1. Якщо вказати цю опцію кілька разів, буде використана та, що вказана останньою.

От і все, нічого складного.

Копірайт: це досить таки вільний переклад статті “GCC options you should know” від Anurag Phadke

Категорії: C/C++ | Теґи:, ,

Коментарів: 1

  1. podarok

    я б додав
    -Os
    -march -mtune

Залишити коментар