Програмування під linux
Крок 1 - Компіляція програм на мові C / C ++ Крок 2 - Отладочная інформація Крок 3 - Компіляція декількох файлів Крок 4 - Бібліотеки об'єктних файлів
Крок 5 - Створення статичної бібліотеки Крок 6 - Створення динамічної бібліотеки
Крок 7 - Використання динамічних бібліотек Крок 8 - Функції роботи з динамічними бібліотеками Крок 9 - Ініціалізація динамічних бібліотек
Крок 10 - Передача опцій в програму - getopt
Крок 11 - Передача довгих опцій в програму - getopt_long Крок 12 - Висновок повідомлень про помилки програми Крок 13 - Отримання інформації про користувача
Крок 14 - Отримання даних з shadow password
Крок 15 - Робота з паролями системи за допомогою функції crypt () Крок 16 - Отримання інформації про групи користувачів
Крок 1 - Компіляція програм на мові C / C ++
Компілятор перетворює код програми на "людському" мові в об'єктний код зрозумілий комп'ютеру. Компіляторів під Linux існує багато, практично для кожного поширеного мови. Більшість найбільш затребуваних компіляторів входить в набір GNU Compiler Collection. відомих під назвою GCC
Objective C. Chill. Fortran. Ada і Java. як бібліотеки для цих мов (libstdc ++. libgcj.).
Компіляція програм проводиться командою:
Після цього, якщо процес компіляції пройде успішно, то ви отримаєте файл завантаження a.out. запустити який можна командою:
Для прикладу давайте напишемо маленьку найпростішу програму:
Крок 2 - Отладочная інформація
Будь-компілятор за замовчуванням постачає об'єктний файл налагоджування. Компілятор gcc також постачає файл такою інформацією і на результат ви можете подивитися самі. При компіляції проекту з попереднього кроку у нас з'явився файл a.out розміром 11817 байт (можливо у вас він може бути іншого розміру).
Вся ця налагоджувальна інформація призначається для налагодження програми отладчиком GNU Debugger. Запустити його ви можете командою:
При цьому запуститься відладчик і наша скомпільована програма. Про налагодженні ми з вами поговоримо окремо і більш детально.
Компілятор gcc може створювати зневадження в різних обсягах і форматах, контролювати які можна спеціальними ключами. Подивитися їх докладний опис можна командою man gcc:
-a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff + -gdwarf -gdwarf + -gstabs -gstabs + -ggdb -p -pg -save-temps -print-file-name = library -print-libgcc-file- name -print-prog-name = program
Ключ -g створює налагоджування в рідному для операційної системи вигляді, він вибирає між кількома форматами: stabs. COFF. XCOFF або DWARF. На багатьох системах даний ключ дозволяє використовувати спеціальну інформацію, яку вміє використовувати тільки відладчик gdb. Інші ключі дозволяють більш тонко контролювати процес вбудовування налагоджувальної інформації.
Ключ -ggdb включає в виконуваний файл зневадження в рідному для ОС вигляді і доповнює її спеціалізованою інформацією для відладчика gdb.
Ключ -gstabs створює зневадження в форматі stabs без додаткових розширень gdb. Даний формат використовується отладчиком DBX на більшості BSD систем. Ключ -gstabs + доповнює зневадження розширенням зрозумілими отладчику gdb.
Ключ -gcoff створює зневадження в форматі COFF. яка використовується отладчиком SDB на більшості систем System V до версії System V R4.
Ключ -gxcoff постачає файл інформацією в форматі XCOFF. який використовується отладчиком DBX на системах IBM RS / 6000. Використання -gxcoff + влкючает використання додаткової інформації для gdb.
Ключ -gdwarf додає інфомацию в форматі DWARF пріняотм в системі System V Release 4. Відповідно ключ -gdwarf + додає можливостей отладчику gdb.
Додавання до цих ключам в кінці цифри дозволяє збільшити або зменшити рівень налагодження, тобто керувати розміром необхідної налагоджувальної інформації. Наприклад ключ:
Збільшить рівень налагодження до 3. за замовчуванням він дорівнює 2. При першому рівні налагодження компілятор включає в файл мінімальну кількість налагоджувальної інформації достатню для налагодження частин програми, які ви не планіровлі налагоджувати. У цю інформацію входить опис функцій і зовнішніх змінних, але не включається інформація про локальних змінних і номери рядків вихідного тексту. Другий рівень - це рівень за замовчуванням, включає в файл більшість потрібної налагоджувальної інформації. Третій рівень дозволяє додати екстра-інформацію, таку як визначення присутніх в програмі макросів.
Вище ви можете побачити інші ключі, які можна використовувати. Більшість цих ключів призначене для виведення дампа програми під час компіляції і служить не для налагодження програми, а для налагодження самого компілятора :)) Тому про них можна забути і не згадувати.
Отладочная інформація це звичайно добре, але вона може значно збільшити обсяг вашого файлу (в три-чотири рази). Для створення програм "релізів" існує окрема програма, що дозволяє видалити зневадження з запускається файлу. Називається ця програма strip. Для того, щоб повністю очистити файл від налагоджувальної інформації, потрібно викликати її з ключем -s.
Після обробки файлу цією командою його розмір зменшився практично в три рази і став 3156 байт. У порівнянні з 11 Кб до цього це дуже навіть добре.
Крок 3 - Компіляція декількох файлів
Зазвичай прості програми складаються з одного вихідного файлу. Насправді все трохи складніше, якщо ця програма стає великою. При роботі з такою програмою може виникнути кілька досить серйозних проблем:
• Файл, стаючи великим, збільшує час компіляції, і найменші зміни в початковому тексті автоматично змушують витрачати час програміста на перекомпіляцію програми.
• Якщо над програмою працює багато людей, то практично неможливо відстежити зроблені зміни.
• Процес правки і саме орієнтування при великому вихідному тексті стає складним і пошук невеликий помилки може спричинити за собою вимушене "вивчення" коду заново.
Це далеко не всі пробеми, які можуть виникнути при наявності програми "монстра". Тому при розробці програм рекомендується їх розбивати на шматки, які функціонально обмежені і закінчені. У цьому значно допомагає сама мова C ++. надаючи свій багатий синтаксис.
Для того, щоб винести функцію або змінну в окремий файл треба перед нею поставити зарезервоване слово extern. Давайте для прикладу створимо програму з декількох файлів. Спочатку створимо головну програму, в якій будуть дві зовнішні процедури. Назвемо цей файл main.c:
// описуємо функцію f1 () як зовнішню extern int f1 ();
// описуємо функцію f2 () як зовнішню extern int f2 ();