Помилки лінковки (компановки) - my program

Рейтинг: 0/5

Після компіляції cpp файлів у файли формату obj збірку цих всіх файлів в єдиний виконуваний файл здійснює програма Лінкер. Очевидно, що і на першому етапі компіляції (збірка cpp файлів у файли obj) і на другому можуть виникнути помилки. На першому етапі нам повинні бути зрозумілі типові помилки. Розглянемо помилки на етапі компонування. Виявляється, їх досить багато і ми розглянемо тільки деякі типові помилки.

1. Визначення змінних та функцій в заголовних файлах.

Давайте уявимо собі, що у нас є файл main.cpp:

Далі в файлі є якась реалізація, але вона нам зараз не важлива. Тепер розглянемо файл lib.h

Ми допустили страшну помилку: визначили в ньому змінну і функцію. Що ж станеться в результаті цього? Давайте подивимося. В процесі компіляції замість #include "lib.h" вставиться вміст самого файлу. Ми зможемо без проблем користуватися змінної i і функцією f всередині файлу main.cpp. Якщо ми всім цим зможемо скористатися і без файлу lib.cpp, тоді навіщо нам потрібен файл lib.h? Розплата настане в той момент, коли ми захочемо створити другий cpp файл в нашому проекті. Давайте дамо йому ім'я other.cpp

Ця перша класична помилка при роботі з заголовками файлами.

Висновок: в заголовних файлах тільки заголовки функції і extern посилання на змінні, визначені поза

2. Оголосили, але забули визначити.

Нехай є файл main.cpp

У файлі lib.h ми описали заголовок функції f, а в файлі lib.cpp ми робимо що завгодно, тільки не описуємо реалізацію функції f. Що станеться? Компілятор компілює main.cpp. Замість #include "lib.h" вставляє вміст файлу lib.h. Він бачить, що функція f була попередньо оголошена і спокійно компілює файл в main.obj. Далі він компілює lib.cpp і отримуємо lib.obj. Потім лінковщік або компановщік спробує з цих двох файлів зробити виконуваний файл. У цьому процесі він буде вирішувати всі зовнішні зв'язки між файлами. В даному випадку він спробує вирішити зв'язок між посиланням на функцію f і її вмістом. Але її реалізації немає. Тому він видасть помилку ліковкі: функція f ніде не визначена. Ця дуже дивна помилка. Всі сучасні компілятори вирішують цю помилку відразу.

3. Оголосили, але визначили по-іншому.

Нехай, знову, будуть файли main.cpp:

Файл main.cpp компілюється без проблем, так як в файлі lib.h сказано, що функція f, що приймає один цілий параметр і повертає ціле значення, десь визначена. Компілятор цьому повірить і відкомпілює наш файл. Крім цього ми дійсно визначає функцію f в іншому cpp файлі, тільки забули її тип, який вона приймає. По суті ми визначили іншу функцію. Це теж відкомпілюйте. І після цього починає працювати лінковщік. Бачачи опис функції f, приймаючу цілий параметр, він починає її шукати в інших obj файлах або в цьому ж файлі. Він її знаходить, але з іншим типом прийнятого значення. Не знайшовши іншу функцію f, він видає помилку лінковки: функція f визначена по-іншому.

Ні в якій іншій мові такі дивні помилки Ви не зустрінете.

Тепер давайте розглянемо плюси цього в наступному уроці.

  • Ви тут:
  • Головна
  • навчання програмуванню
  • C ++
  • Помилки лінковки (компановки)