Опції gcc, про які варто знати
Липень 16th, 2008
Використання консольного GCC – страшний нічний кошмар для новачків, що звикли до зручних графічних середовищ програмування у Windows. Величезна кількість опцій командного рядка лякає навіть відчайдухів, які відкривають man в надії знайти рішення проблеми. В цій замітці я коротко опишу найцікавіші опції GCC, про які варто знати усім.
Типовий синтаксис виклику компілятора такий:
gcc <опція> <файл з текстом програми>
Всі опції, перераховані нижче, чуливі до регістру. Наприклад, -v має геть інше значення, ніж -V. Крім того, не варто записувати опції поряд, краще окремо. -vc це зовсім не те ж, що -v -c.
Слід пам’ятати, що розширення файлу має значення. За ним визначається тип файлу, як саме його треба компілювати. Приклади:
- *.c – файл з програмою на С. Такі файли обробляються, компілюються і переводяся на мову асемблера
- *.m – файл з кодом мовою Objective-C, в нас не дуже поширеною. Обробляється так само, як і *.с
- *.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++ | Теґи:c/c++, gcc, програмування



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