GoGPT Best VPN GoSearch

Значок OnWorks

makepp_tutorial_compilation - Інтернет у хмарі

Запустіть makepp_tutorial_compilation у постачальника безкоштовного хостингу OnWorks через Ubuntu Online, Fedora Online, онлайн-емулятор Windows або онлайн-емулятор MAC OS

Це команда makepp_tutorial_compilation, яку можна запустити в постачальнику безкоштовного хостингу OnWorks за допомогою однієї з наших численних безкоштовних робочих станцій, таких як Ubuntu Online, Fedora Online, онлайн емулятор Windows або онлайн емулятор MAC OS

ПРОГРАМА:

ІМ'Я


makepp_tutorial_compilation -- Команди компіляції Unix

ОПИС


Пропустіть цю сторінку посібника, якщо ви добре розумієте, що роблять команди компіляції.

Я вважаю, що дуже мало людей, здається, навчаються на уроках програмування
щоб приступити до компіляції програм, коли вони їх написали. Новачки розраховують або на одиночний
запам’ятову команду, або за вбудованими правилами в make. Я був здивований
надзвичайно комп'ютерно грамотні люди, які навчилися компілювати без оптимізації т.к
їм просто ніколи не говорили, наскільки це важливо. Зачаткові знання про те, як компіляція
робота команд може призвести до того, що ваші програми будуть працювати вдвічі швидше або навіть більше, тому це варто принаймні
п'ять хвилин. На цій сторінці описано майже все, що вам потрібно знати для компіляції C
або програми C++ майже на будь-якому варіанті Unix.

Приклади будуть переважно для C, оскільки компіляція C++ ідентична, за винятком імені
компілятора відрізняється. Припустимо, ви компілюєте вихідний код у файл з назвою
"xyz.c", і ви хочете створити програму під назвою "xyz". Що має статися?

Можливо, ви знаєте, що ви можете створити свою програму за один крок, використовуючи таку команду:

cc -g xyz.c -o xyz

Це спрацює, але це приховує двоетапний процес, який ви повинні розуміти, якщо так
написання make-файлів. (Насправді, є більше двох кроків, але вам потрібно лише зробити
розуміти два з них.) Для програми з більш ніж одним модулем зазвичай два кроки
явно відокремлені.

Compilation
Першим кроком є ​​переклад вашого вихідного коду C або C++ у двійковий файл під назвою
об'єктний файл. Об’єктні файли зазвичай мають розширення «.o». (Для деяких останніх
проекти, ".lo" також використовується для дещо іншого типу об'єктного файлу.)

Команда створення об’єктного файлу в Unix виглядає приблизно так:

cc -g -c xyz.c -o xyz.o

"cc" - це компілятор C. Іноді використовуються альтернативні компілятори C; дуже поширеним є
називається "gcc". Поширеним компілятором C++ є компілятор GNU, який зазвичай називають «g++». Віртуально
всі компілятори C і C++ в Unix мають однаковий синтаксис для решти команди (принаймні
для основних операцій), тож єдиною відмінністю буде перше слово.

Ми пояснимо, що робить параметр "-g" пізніше.

Параметр "-c" повідомляє компілятору C створити файл ".o" як вихідний результат. (Якщо ви цього не зробите
вкажіть «-c», тоді другий крок компіляції виконується автоматично.)

Параметр "-o xyz.o" повідомляє компілятору ім'я об'єктного файлу. Ти можеш
опустіть це, якщо ім’я об’єктного файлу збігається з назвою джерела
файл, за винятком розширення ".o".

Здебільшого порядок параметрів та імена файлів не мають значення. один
Важливим винятком є ​​те, що вихідний файл має одразу слідувати за "-o".

Зв'язуючий
Другий крок побудови програми називається Зв'язуючий. Неможливо запустити об’єктний файл
безпосередньо; це проміжна форма, яка має бути пов'язаний до інших компонентів, щоб
виробити програму. Інші компоненти можуть включати:

· Бібліотеки. А бібліотека, грубо кажучи, являє собою набір об'єктних модулів, які є
включені в міру необхідності. Наприклад, якщо ваша програма викликає функцію printf, то
визначення функції «printf» має бути включено з бібліотеки системної C.
Деякі бібліотеки автоматично підключаються до вашої програми (наприклад, та, що містить
"printf"), тому вам ніколи не доведеться турбуватися про них.

· Об'єктні файли, отримані з інших вихідних файлів у вашій програмі. Якщо ви напишете своє
програму, щоб вона фактично мала кілька вихідних файлів, зазвичай ви збираєте кожен
вихідний файл в окремий об’єктний файл, а потім пов’язати їх усі разом.

Команда Компонувальник це програма, яка відповідає за збірку об’єктних файлів і
бібліотеки та об’єднання їх разом для створення виконуваного файлу. Виконуваний файл є
програму, яку ви насправді запускаєте.

Команда для зв'язування програми виглядає приблизно так:

cc -g xyz.o -o xyz

Це може здатися дивним, але зазвичай ми запускаємо ту саму програму ("cc"), щоб виконати зв'язування. Що
Під поверхнею відбувається те, що програма "cc" негайно передає керування a
іншу програму (компонент, який іноді називають завантажувачем, або "ld") після додавання номера
складної інформації в командний рядок. Наприклад, "cc" вказує "ld", де
Системна бібліотека містить визначення таких функцій, як "printf". Поки ти не
Почніть писати спільні бібліотеки, зазвичай не потрібно мати справу безпосередньо з «ld».

Якщо ви не вкажете «-o xyz», то вихідний файл буде називатися «a.out», що здається
для мене це абсолютно марна і заплутана умовність. Тому завжди вказуйте "-o" на
крок зв'язку.

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

Чому ви необхідність до окремий кроки
Чому б просто не використати просту однокрокову команду, наприклад:

cc -g xyz.c -o xyz

замість більш складної двоетапної компіляції

cc -g -c xyz.c -o xyz.o
cc -g xyz.o -o xyz

якщо внутрішньо перше перетворюється на друге? Різниця важлива лише в тому випадку
у вашій програмі є більше одного модуля. Припустимо, у нас є додатковий модуль,
"abc.c". Тепер наша компіляція виглядає так:

# Одноетапна команда.
cc -g xyz.c abc.c -o xyz

or

# Двоступенева команда.
cc -g -c xyz.c -o xyz.o
cc -g -c abc.c -o abc.o
cc -g xyz.o abc.o -o xyz

Перший метод, звичайно, внутрішньо перетворюється на другий метод. Це означає
що обидва "xyz.c" і "abc.c" перекомпілюються кожного разу під час виконання команди. Але якщо ти
змінився лише "xyz.c", немає необхідності перекомпілювати "abc.c", тому другий рядок з двох-
сценічні команди виконувати не потрібно. Це може мати величезну різницю в компіляції
часу, особливо якщо у вас багато модулів. З цієї причини практично всі make-файли зберігаються
два етапи компіляції розділені.

Це майже основи, але є ще кілька дрібних деталей, які вам дійсно варто
знати про.

Налагодження проти оптимізація
Зазвичай програмісти компілюють програму або для налагодження, або для швидкості. Компіляція
для швидкості називається оптимізація; компіляція з оптимізацією може привести до виконання вашого коду
У 5 разів швидше або більше, залежно від вашого коду, процесора та компілятора.

Чому б ви ніколи не захотіли оптимізувати, маючи такі значні досягнення? Найбільший
Важлива відповідь полягає в тому, що оптимізація значно ускладнює використання налагоджувача
(іноді неможливо). (Якщо ви нічого не знаєте про налагоджувач, настав час вчитися.
Півгодини або години, які ви витратите на вивчення основ, окупляться багаторазово
за час, який ви заощадите пізніше під час налагодження. Я б рекомендував почати з налагоджувача графічного інтерфейсу
наприклад "kdbg", "ddd" або "gdb", запускається з emacs (див. інформаційні сторінки на gdb для
інструкції про те, як це зробити).) Оптимізація змінює порядок та об’єднує оператори, видаляє
непотрібні тимчасові змінні, і взагалі перебудовує ваш код так, щоб він був дуже
важко дотримуватися всередині налагоджувача. Звичайна процедура - написати свій код, зібрати його
без оптимізації, налагодьте його, а потім увімкніть оптимізацію.

Щоб налагоджувач працював, компілятор повинен співпрацювати не тільки через not
оптимізації, а також шляхом розміщення інформації про назви символів в об'єкт
файл, щоб налагоджувач знав, як називаються речі. Ось що складається з компіляції "-g".
варіант робить.

Якщо ви завершили налагодження й хочете оптимізувати свій код, просто замініть "-g" на
"-О". Для багатьох компіляторів можна вказати підвищення рівня оптимізації шляхом додавання
число після "-O". Ви також можете вказати інші параметри, які збільшують
швидкість за деяких обставин (можливо, компенсація збільшенням використання пам’яті). Побачити
Довідкову сторінку компілятора для отримання детальної інформації. Наприклад, ось команда оптимізації компіляції
що я часто використовую з компілятором "gcc":

gcc -O6 -malign-double -c xyz.c -o xyz.o

Можливо, вам доведеться поекспериментувати з різними варіантами оптимізації для досягнення найкращого результату
продуктивність. Вам можуть знадобитися різні варіанти для різних фрагментів коду. Загалом
кажучи, простий прапор оптимізації, як-от "-O6", працює з багатьма компіляторами і зазвичай
дає досить хороші результати.

Попередження: у рідкісних випадках ваша програма насправді робить не те саме, коли
він складається з оптимізацією. Це може бути пов’язано з (1) неправильним припущенням, яке ви зробили
у вашому коді, який був нешкідливим без оптимізації, але викликає проблеми, оскільки
компілятор бере на себе вільність переставляти речі під час оптимізації; або (2) на жаль,
У компіляторів також є помилки, включаючи помилки в оптимізаторах. Для стабільного компілятора, як
"gcc" на звичайній платформі, як-от Pentium, помилки оптимізації рідко є проблемою (стан
2000 рік - кілька років тому були проблеми).

Якщо ви не вкажете ні «-g», ні «-O» у вашій команді компіляції, отриманий об’єкт
файл не підходить ні для налагодження, ні для швидкого запуску. Чомусь це
за замовчуванням. Тому завжди вказуйте або «-g», або «-O».

У деяких системах ви повинні вказати "-g" як на етапі компіляції, так і на етапі зв'язування; на інших
(наприклад, Linux), його потрібно надати лише на етапі компіляції. У деяких системах "-O"
насправді робить щось інше на фазі підключення, тоді як на інших це не впливає.
У будь-якому випадку, завжди нешкідливо вводити «-g» або «-O» для обох команд.

Попередження
Більшість компіляторів здатні вловити ряд поширених програмних помилок (наприклад,
забувши повернути значення з функції, яка повинна повертати значення). Зазвичай,
ви хочете ввімкнути попередження. Як ви це робите, залежить від вашого компілятора (див. man
сторінку), але з компілятором "gcc" я зазвичай використовую щось на зразок цього:

gcc -g -Стіна -c xyz.c -o xyz.o

(Іноді я також додаю "-Wno-uninitialized" після "-Wall" через попередження, що
зазвичай неправильно, що з’являється під час оптимізації.)

Ці попередження заощадили мені багато годин на налагодження.

Інше корисний компіляція опції
Часто необхідні включення файли зберігаються в якомусь каталозі, відмінному від поточного
каталог або каталог системного включення (/ usr / include). Це часто трапляється, коли
ви використовуєте бібліотеку, яка постачається з файлами включення для визначення функцій або класів.

Припустимо, наприклад, ви пишете програму, яка використовує бібліотеки Qt. Ви маєте
встановив локальну копію бібліотеки Qt /home/users/joe/qt, що означає, що
включаються файли зберігаються в каталозі /home/users/joe/qt/include. У вашому коді ви
хочу вміти робити такі речі:

#включати

замість

#include "/home/users/joe/qt/include/qwidget.h"

Ви можете наказати компілятору шукати включені файли в іншому каталозі за допомогою
Параметр компіляції "-I":

g++ -I/home/users/joe/qt/include -g -c mywidget.cpp -o mywidget.o

Зазвичай між «-I» та назвою каталогу немає пробілу.

Коли компілятор C++ шукає файл qwidget.h, він загляне всередину
/home/users/joe/qt/include перед пошуком у системному каталозі include. Ти можеш
вкажіть стільки параметрів "-I", скільки забажаєте.

використання libraries
Вам часто доведеться вказувати компонувальнику зв’язатися з певними зовнішніми бібліотеками, якщо ви
викликають будь-які функції, які не є частиною стандартної бібліотеки C. "-l" (малий регістр
L) параметр говорить про зв'язування з певною бібліотекою:

cc -g xyz.o -o xyz -lm

"-lm" говорить про зв'язок із системною математичною бібліотекою, яка вам знадобиться, якщо ви використовуєте
такі функції, як "sqrt".

Обережно: якщо ви вкажете більше одного параметра "-l", порядок може мати значення для деяких
системи. Якщо ви отримуєте невизначені змінні, коли знаєте, що включили файл
бібліотеку, яка їх визначає, ви можете спробувати перемістити цю бібліотеку в кінець команди
рядка або навіть включити його вдруге в кінці командного рядка.

Іноді бібліотеки, які вам знадобляться, не зберігаються в системі за замовчуванням
бібліотеки. "-labc" шукає файл під назвою libabc.a or libabc.so or libabc.sa ,
каталоги системної бібліотеки (/ Usr / Бібліотека і зазвичай в кількох інших місцях, залежно від чого
тип Unix, який ви використовуєте). Параметр "-L" визначає додатковий каталог для пошуку
для бібліотек. Щоб знову взяти наведений вище приклад, припустимо, що ви встановили бібліотеки Qt
in /home/users/joe/qt, що означає, що файли бібліотеки знаходяться в /home/users/joe/qt/lib.
Ваш крок посилання для вашої програми може виглядати приблизно так:

g++ -g test_mywidget.o mywidget.o -o test_mywidget -L/home/users/joe/qt/lib -lqt

(У деяких системах, якщо ви посилаєте в Qt, вам також потрібно буде додати інші бібліотеки (наприклад,
"-L/usr/X11R6/lib -lX11 -lXext"). Те, що вам потрібно зробити, залежить від вашої системи.)

Зауважте, що між «-L» та назвою каталогу немає пробілу. Зазвичай параметр "-L".
стоїть перед будь-якими параметрами "-l", на які має впливати.

Як дізнатися, які бібліотеки вам потрібні? Загалом, це складне питання, яке варіюється
залежно від того, який тип Unix ви використовуєте. Документація для функцій або
класи, які ви використовуєте, повинні вказати, з якими бібліотеками потрібно підключити. Якщо ви використовуєте
функцій або класів із зовнішнього пакета, зазвичай є бібліотека, яку потрібно підключити
з; бібліотека зазвичай представляє собою файл під назвою "libabc.a" або "libabc.so" або "libabc.sa"
якщо вам потрібно додати параметр "-labc".

Дещо Інше заплутаний речі
Можливо, ви помітили, що можна вказати параметри, які зазвичай застосовуються
компіляцію на етапі зв'язування та параметри, які зазвичай застосовуються до посилання на
етап компіляції. Наприклад, дійсні такі команди:

cc -g -L/usr/X11R6/lib -c xyz.c -o xyz.o
cc -g -I/десь/включити xyz.o -o xyz

Невідповідні параметри ігноруються; наведені вище команди точно еквівалентні цій:

cc -g -c xyz.c -o xyz.o
cc -g xyz.o -o xyz

Використовуйте makepp_tutorial_compilation онлайн за допомогою служб onworks.net


Безкоштовні сервери та робочі станції

Завантажте програми для Windows і Linux

Команди Linux

Ad




×
реклама
❤️Робіть покупки, бронюйте або купуйте тут — безкоштовно, це допомагає зберегти послуги безкоштовними.