0.5 – Введение в компилятор, компоновщик (линкер) и библиотеки

Шаг 4. Компиляция исходного кода
Сначала он проверяет ваш код, чтобы убедиться, что он соответствует правилам языка C++. В противном случае компилятор выдаст вам ошибку (и номер соответствующей строки), чтобы помочь точно определить, что нужно исправить. Процесс компиляции будет прерван, пока ошибка не будет исправлена.

Компиляторы C++ доступны для многих операционных систем. Мы скоро обсудим установку компилятора, поэтому сейчас нет необходимости останавливаться на этом.
Шаг 5. Компоновка (линковка) объектных файлов и библиотек
После того, как компилятор создал один или несколько объектных файлов, включается другая программа, называемая компоновщиком (линкером). Работа компоновщика состоит из трех частей:
Во-первых, взять все объектные файлы, сгенерированные компилятором, и объединить их в единую исполняемую программу.

Во-вторых, помимо возможности связывать объектные файлы, компоновщик (линкер) также может связывать файлы библиотек. Файл библиотеки – это набор предварительно скомпилированного кода, который был «упакован» для повторного использования в других программах.
Вы также можете при желании выполнить линковку с другими библиотеками. Например, если вы собрались написать программу, которая воспроизводит звук, вы, вероятно, не захотите писать свой собственный код для чтения звуковых файлов с диска, проверки их правильности или выяснения, как маршрутизировать звуковые данные к операционной системе или оборудованию для воспроизведения через динамик – это потребует много работы! Вместо этого вы, вероятно, загрузили бы библиотеку, которая уже знала, как это сделать, и использовали бы ее. О том, как связывать библиотеки (и создавать свои собственные!), мы поговорим в приложении.
Как только компоновщик завершит линковку всех объектных файлов и библиотек (при условии, что всё идет хорошо), вы получите исполняемый файл, который затем можно будет запустить!
Для продвинутых читателей
Для сложных проектов в некоторых средах разработки используется make-файл (makefile), который представляет собой файл, описывающий, как собрать программу (например, какие файлы компилировать и связывать, или обрабатывать какими-либо другими способами). О том, как писать и поддерживать make-файлы, написаны целые книги, и они могут быть невероятно мощным инструментом. Однако, поскольку make-файлы не являются частью ядра языка C++, и вам не нужно их использовать для продолжения изучения, мы не будем обсуждать их в рамках данной серии статей.
Шаги 6 и 7. Тестирование и отладка
Это самое интересное (надеюсь)! Вы можете запустить исполняемый файл и посмотреть, выдаст ли он ожидаемый результат!
Если ваша программа работает, но работает некорректно, то пора немного ее отладить, чтобы выяснить, что не так. Мы обсудим, как тестировать ваши программы и как их отлаживать, более подробно в ближайшее время.
Интегрированные среды разработки (IDE)
Обратите внимание, что шаги 3, 4, 5 и 7 включают в себя использование программного обеспечения (редактор, компилятор, компоновщик, отладчик). Хотя для каждого из этих действий вы можете использовать отдельные программы, программный пакет, известный как интегрированная среда разработки (IDE), объединяет все эти функции вместе. Мы обсудим IDE и установим одну из них в следующем разделе.
СОДЕРЖАНИЕ
Обзор
Для большинства компиляторов каждый объектный файл является результатом компиляции одного входного файла исходного кода. Когда программа состоит из нескольких объектных файлов, компоновщик объединяет эти файлы в единую исполняемую программу, разрешая символы по мере продвижения.
Выполняемый вывод компоновщика может потребовать еще одного прохода перемещения, когда он окончательно загружен в память (непосредственно перед выполнением). Этот проход обычно не выполняется на оборудовании, предлагающем виртуальную память : каждая программа помещается в свое собственное адресное пространство, поэтому конфликта нет, даже если все программы загружаются по одному и тому же базовому адресу. Этот проход также можно пропустить, если исполняемый файл является независимым от позиции исполняемым файлом.
Динамическое связывание
Многие среды операционных систем допускают динамическое связывание, откладывая разрешение некоторых неопределенных символов до запуска программы. Это означает, что исполняемый код по-прежнему содержит неопределенные символы, а также список объектов или библиотек, которые предоставят их определения. Загрузка программы также загрузит эти объекты / библиотеки и выполнит окончательную компоновку.
Такой подход дает два преимущества:
Статическое связывание
Переезд
Редактор связей
Одним из преимуществ этого является то, что он позволяет поддерживать программу без необходимости хранить все промежуточные объектные файлы или без необходимости повторно компилировать разделы программы, которые не изменились. Это также позволяет распространять обновления программы в виде небольших файлов (первоначально колоды карточек ), содержащих только заменяемый объектный модуль. В таких системах объектный код имеет форму и формат 80-байтовых изображений перфокарт, так что обновления могут быть внесены в систему, использующую этот носитель. В более поздних выпусках OS / 360 и в последующих системах загрузочные модули содержат дополнительные данные о версиях модулей компонентов для создания отслеживаемой записи обновлений. Это также позволяет добавлять, изменять или удалять структуру наложения из уже связанного загрузочного модуля.
Редактирование связей ( номенклатура IBM ) или объединение или сбор ( номенклатура ICL ) относится к действиям редактора связей или консолидатора по объединению различных частей в перемещаемый двоичный файл, тогда как загрузка и перемещение в абсолютный двоичный файл по целевому адресу обычно считается отдельным шаг.
Общие реализации
Компоновщик GNU
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
Linker (Link Editor)
Содержание
Обзор
Компьютерные программы состоят из нескольких частей или модулей. Для связывания модулей компоновщик использует таблицы символов, созданные компилятором в каждом из объектных модулей. Эти таблицы могут содержать символы следующих типов:
Для большинства компиляторов, один объектный файл является результатом компиляции одного файла с исходным кодом. Если программа собирается из нескольких объектных файлов, компоновщик собирает эти файлы в единый исполнимый модуль, вычисляя и подставляя адреса вместо символов, в течение времени компоновки (статическая компоновка) или во время исполнения (динамическая компоновка). [Источник 1]
Компоновщик может извлекать объектные файлы из специальных коллекций, называемых библиотеками. Если не все символы, на которые ссылаются пользовательские объектные файлы, определены, то компоновщик ищет их определения в библиотеках, которые пользователь подал ему на вход. Обычно, одна или несколько системных библиотек используются компоновщиком по умолчанию. Когда объектный файл, в котором содержится определение какого-либо искомого символа, найден, компоновщик может включить его (файл) в исполнимый модуль (в случае статической компоновки) или отложить это до момента запуска программы (в случае динамической компоновки).
Динамическая компоновка
Многие операционные системы позволяют динамическое связывание, то есть компоновщик собирает файлы в единый исполнимый модуль, вычисляя и подставляя адреса вместо символов во время запуска программы. Это означает, что исполняемый код все еще содержит неопределенные символы, а также список объектов или библиотек, которые будут предоставлять определения для них. Загрузка программы добавит эти объекты / библиотеки и выполнит окончательную компоновку.
Такой подход дает два преимущества:
Статическая компоновка
Статическая компоновка является результатом компоновщика, копирующего все программные библиотеки, используемые в программе, в исполняемый образ. Это может потребовать больше дискового пространства и памяти, чем динамической компоновки, но более переносимо, так как не требует наличия библиотеки в системе, где она выполняется.
Релокация
После того как линковщик разрешил адресацию всех символов, каждая адресация символа ссылается ровно на одно определение символа. В этот момент линковщик запускает процесс релокации, состоящий из двух шагов:
Загрузчик
Более простая версия, которая записывает свой вывод напрямую в память, называется загрузчиком, хотя загрузка, как правило, рассматривается как отдельный процесс. Загрузчик является частью операционной системы, которая отвечает за загрузку программ и библиотек. Это является одним из существенных этапов в процессе запуска программы, поскольку она помещает программы в память и подготавливает их к исполнению.
Все операционные системы, которые поддерживают загрузку программы, имеют загрузчики, за исключением высокоспециализированных компьютерных систем, которые имеют только фиксированный набор специализированных программ. Встраиваемые системы обычно не имеют загрузчиков, и вместо этого код выполняется непосредственно из ПЗУ. Для загрузки самой операционной системы в процессе загрузки используется специализированный загрузчик. Во многих операционных системах загрузчик постоянно находится в памяти, хотя некоторые операционные системы, поддерживающие виртуальную память, могут позволить загрузчику располагаться в области памяти, которая доступна для загрузки.
Microsoft Windows
Редактор связей
В средах мэйнфреймов IBM System / 360, таких как OS / 360, включая z / OS для мейнфреймов z / Architecture, этот тип программы известен как редактор связей. Тем не менее, редактор связей, как следует из названия, имеет дополнительную возможность, позволяющую добавлять, заменять и / или удалять отдельные разделы программы. Операционные системы, такие как OS / 360, имеют разные форматы для исполняемых загрузочных модулей, поскольку они содержат дополнительные данные о компонентах разделов программы, так что отдельный раздел программы может быть заменен, а другие части программы обновлены так, что Перемещаемые адреса и другие подобные ссылки могут быть исправлены редактором связей как часть процесса.
Одним из преимуществ этого является то, что он позволяет поддерживать программу без необходимости хранить все промежуточные объектные файлы или без повторной компиляции разделов программы, которые не были изменены. Он также позволяет распространять обновления программ в виде небольших файлов (изначально предназначенных для карт), содержащих только заменяемый объектный модуль. В таких системах объектный код имеет форму и формат колоды перфокарт, так что обновления могут быть введены в систему с использованием этого носителя. В более поздних выпусках OS / 360 и последующих системах модули загрузки содержат дополнительные данные о версиях модулей компонентов, чтобы создать отслеживаемую запись обновлений.
Приложения
Linker 2.3.1.17
После запуска программы появится русскоязычный интерфейс.
Необходимо добавить нужные программы в список, установить порядок программ, перетаскивая значки программ мышкой. Таким образом, можно хранить набор своих программ в отдельной папке, а для работы с ними запускать Linker.
Linker «ест» очень мало ресурсов компьютера. Программа так же отслеживает запуск нескольких своих копий, то есть если случайно повторно ее запустить, то на экране появится ранее запущенная копия Linker, а «лишняя» автоматически закроется.
Linker 2.1.2.5
Как результат, сегодня у многих квалифицированных пользователей (а тем более — у IТ-специалистов) имеются свои собственные подборки портативных приложений — тех, которые оказываются им нужны наиболее часто. При необходимости запустить ту или иную программу приходится открывать флешку, искать папку (порой вложенную еще в несколько подкаталогов), в ней искать исполняемый файл и запускать его. Программа Linker сильно упрощает задачу: она позволяет собрать все ссылки на нужные программы, файлы и папки в одном месте. То есть создать каталог всех нужных пользователю данных с непосредственными ссылками на них. В результате вызывать любую программу, добавленную в список, можно всего в один клик, без долгих поисков. Главное преимущество программы Linker — ее универсальность. Пользователь волен самостоятельно создавать собственные разделы, нужные только ему. То есть разработчики не предопределили никаких жестко прописанных разделов. Причем можно добавлять ссылки не только на portable-версии нужных программ, но и на любые другие файлы и даже папки без каких-либо ограничений. Более того, при желании Linker можно использовать на локальном жестком диске в качестве программы для быстрого запуска приложений и документов. Но все же главная задача Linker — «навести порядок» на флешке. Linker имеет весьма простой и скромный интерфейс. Отсутствие готовых предустановленных разделов позволяет настроить все создаваемые разделы под свои нужды. Linker не требует установки, достаточно просто распаковать его в любое место. При первом запуске рядом с исполняемым файлом программы появятся еще два файла, которые не следует удалять: в одном из них хранится информация обо всех добавленных ссылках, а во втором — настройки самого Linker’a. Данные хранятся в формате XML.
При первом запуске пользователь видит только небольшое пустое окошко с четырьмя кнопками вверху. Первая вызывает меню программы, вторая дает возможность добавлять новые записи в список, третья служит для редактирования уже добавленных ссылок, а последняя позволяет удалять их. Итак, начинаем с создания нужных разделов. Жмем кнопку «Добавить» и в появившемся меню выбираем пункт «Добавить группу». Появляется новое окошко, в которое следует ввести название и описание для создаваемой группы (описание не обязательно). Жмем кнопку ОК, и новая группа добавляется в список.
Понятно, что группы предназначены для размещения в них ссылок на программы или файлы. Чтобы поместить ссылку в группу, можно воспользоваться тем же меню «Добавить» (выбрать пункт «Добавить элемент»). Но можно действовать проще и быстрее: просто перетащить нужный файл в окно программы. Linker полностью поддерживает Drag&Drop, так что после перетаскивания нового элемента базовая информация о нем в виде ссылки и иконки будет автоматически добавлена в форму.
После этого пользователю остается только задать название, указать дополнительные параметры запуска новой программы и добавить ей описание. Есть один нюанс — для того, чтобы иметь возможность сворачивать разделы, следует все относящиеся к данному разделу программы просто перетащить на название нужной группы. После этого рядом с названием появится значок «+». Теперь, после нажатия на название группы или на плюсик, список будет раскрываться.
Перед выходом из программы необходимо сохранять изменения. Для этого потребуется зайти в меню «Доп. функции» и выбрать пункт «Сохранить конфигурацию». Поиск по фильтру. Если флешка большого объема и хранит много программ и файлов, их список может оказаться достаточно большим. Для облегчения работы с такими списками в программе присутствует функция фильтрации. Чтобы быстро найти нужный элемент, достаточно начать вводить его название. В ответ Linker выдаст список, в котором присутствуют только те записи, в которых встречается введенная пользователем комбинация символов. Чтобы вернуться к общему списку, достаточно убрать введенные символы клавишей Backspace.
Самый известный платный аналог Linker — это CodySafe ($9.90). Программа CodySafe интегрирована с онлайновой базой portable-софта. У Linker такой интеграции нет, однако пользователь может скачать с официального сайта небольшую подборку полезных утилит, названную «Быстрый старт». Из более-менее заметных преимуществ CodySafe перед Linker можно отметить разве что поддержку скинов.
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
Linker (Link Editor)
Содержание
Обзор
Компьютерные программы состоят из нескольких частей или модулей. Для связывания модулей компоновщик использует таблицы символов, созданные компилятором в каждом из объектных модулей. Эти таблицы могут содержать символы следующих типов:
Для большинства компиляторов, один объектный файл является результатом компиляции одного файла с исходным кодом. Если программа собирается из нескольких объектных файлов, компоновщик собирает эти файлы в единый исполнимый модуль, вычисляя и подставляя адреса вместо символов, в течение времени компоновки (статическая компоновка) или во время исполнения (динамическая компоновка). [Источник 1]
Компоновщик может извлекать объектные файлы из специальных коллекций, называемых библиотеками. Если не все символы, на которые ссылаются пользовательские объектные файлы, определены, то компоновщик ищет их определения в библиотеках, которые пользователь подал ему на вход. Обычно, одна или несколько системных библиотек используются компоновщиком по умолчанию. Когда объектный файл, в котором содержится определение какого-либо искомого символа, найден, компоновщик может включить его (файл) в исполнимый модуль (в случае статической компоновки) или отложить это до момента запуска программы (в случае динамической компоновки).
Динамическая компоновка
Многие операционные системы позволяют динамическое связывание, то есть компоновщик собирает файлы в единый исполнимый модуль, вычисляя и подставляя адреса вместо символов во время запуска программы. Это означает, что исполняемый код все еще содержит неопределенные символы, а также список объектов или библиотек, которые будут предоставлять определения для них. Загрузка программы добавит эти объекты / библиотеки и выполнит окончательную компоновку.
Такой подход дает два преимущества:
Статическая компоновка
Статическая компоновка является результатом компоновщика, копирующего все программные библиотеки, используемые в программе, в исполняемый образ. Это может потребовать больше дискового пространства и памяти, чем динамической компоновки, но более переносимо, так как не требует наличия библиотеки в системе, где она выполняется.
Релокация
После того как линковщик разрешил адресацию всех символов, каждая адресация символа ссылается ровно на одно определение символа. В этот момент линковщик запускает процесс релокации, состоящий из двух шагов:
Загрузчик
Более простая версия, которая записывает свой вывод напрямую в память, называется загрузчиком, хотя загрузка, как правило, рассматривается как отдельный процесс. Загрузчик является частью операционной системы, которая отвечает за загрузку программ и библиотек. Это является одним из существенных этапов в процессе запуска программы, поскольку она помещает программы в память и подготавливает их к исполнению.
Все операционные системы, которые поддерживают загрузку программы, имеют загрузчики, за исключением высокоспециализированных компьютерных систем, которые имеют только фиксированный набор специализированных программ. Встраиваемые системы обычно не имеют загрузчиков, и вместо этого код выполняется непосредственно из ПЗУ. Для загрузки самой операционной системы в процессе загрузки используется специализированный загрузчик. Во многих операционных системах загрузчик постоянно находится в памяти, хотя некоторые операционные системы, поддерживающие виртуальную память, могут позволить загрузчику располагаться в области памяти, которая доступна для загрузки.
Microsoft Windows
Редактор связей
В средах мэйнфреймов IBM System / 360, таких как OS / 360, включая z / OS для мейнфреймов z / Architecture, этот тип программы известен как редактор связей. Тем не менее, редактор связей, как следует из названия, имеет дополнительную возможность, позволяющую добавлять, заменять и / или удалять отдельные разделы программы. Операционные системы, такие как OS / 360, имеют разные форматы для исполняемых загрузочных модулей, поскольку они содержат дополнительные данные о компонентах разделов программы, так что отдельный раздел программы может быть заменен, а другие части программы обновлены так, что Перемещаемые адреса и другие подобные ссылки могут быть исправлены редактором связей как часть процесса.
Одним из преимуществ этого является то, что он позволяет поддерживать программу без необходимости хранить все промежуточные объектные файлы или без повторной компиляции разделов программы, которые не были изменены. Он также позволяет распространять обновления программ в виде небольших файлов (изначально предназначенных для карт), содержащих только заменяемый объектный модуль. В таких системах объектный код имеет форму и формат колоды перфокарт, так что обновления могут быть введены в систему с использованием этого носителя. В более поздних выпусках OS / 360 и последующих системах модули загрузки содержат дополнительные данные о версиях модулей компонентов, чтобы создать отслеживаемую запись обновлений.
Приложения
Linker 2.3.1.17
После запуска программы появится русскоязычный интерфейс.
Необходимо добавить нужные программы в список, установить порядок программ, перетаскивая значки программ мышкой. Таким образом, можно хранить набор своих программ в отдельной папке, а для работы с ними запускать Linker.
Linker «ест» очень мало ресурсов компьютера. Программа так же отслеживает запуск нескольких своих копий, то есть если случайно повторно ее запустить, то на экране появится ранее запущенная копия Linker, а «лишняя» автоматически закроется.
Linker 2.1.2.5
Как результат, сегодня у многих квалифицированных пользователей (а тем более — у IТ-специалистов) имеются свои собственные подборки портативных приложений — тех, которые оказываются им нужны наиболее часто. При необходимости запустить ту или иную программу приходится открывать флешку, искать папку (порой вложенную еще в несколько подкаталогов), в ней искать исполняемый файл и запускать его. Программа Linker сильно упрощает задачу: она позволяет собрать все ссылки на нужные программы, файлы и папки в одном месте. То есть создать каталог всех нужных пользователю данных с непосредственными ссылками на них. В результате вызывать любую программу, добавленную в список, можно всего в один клик, без долгих поисков. Главное преимущество программы Linker — ее универсальность. Пользователь волен самостоятельно создавать собственные разделы, нужные только ему. То есть разработчики не предопределили никаких жестко прописанных разделов. Причем можно добавлять ссылки не только на portable-версии нужных программ, но и на любые другие файлы и даже папки без каких-либо ограничений. Более того, при желании Linker можно использовать на локальном жестком диске в качестве программы для быстрого запуска приложений и документов. Но все же главная задача Linker — «навести порядок» на флешке. Linker имеет весьма простой и скромный интерфейс. Отсутствие готовых предустановленных разделов позволяет настроить все создаваемые разделы под свои нужды. Linker не требует установки, достаточно просто распаковать его в любое место. При первом запуске рядом с исполняемым файлом программы появятся еще два файла, которые не следует удалять: в одном из них хранится информация обо всех добавленных ссылках, а во втором — настройки самого Linker’a. Данные хранятся в формате XML.
При первом запуске пользователь видит только небольшое пустое окошко с четырьмя кнопками вверху. Первая вызывает меню программы, вторая дает возможность добавлять новые записи в список, третья служит для редактирования уже добавленных ссылок, а последняя позволяет удалять их. Итак, начинаем с создания нужных разделов. Жмем кнопку «Добавить» и в появившемся меню выбираем пункт «Добавить группу». Появляется новое окошко, в которое следует ввести название и описание для создаваемой группы (описание не обязательно). Жмем кнопку ОК, и новая группа добавляется в список.
Понятно, что группы предназначены для размещения в них ссылок на программы или файлы. Чтобы поместить ссылку в группу, можно воспользоваться тем же меню «Добавить» (выбрать пункт «Добавить элемент»). Но можно действовать проще и быстрее: просто перетащить нужный файл в окно программы. Linker полностью поддерживает Drag&Drop, так что после перетаскивания нового элемента базовая информация о нем в виде ссылки и иконки будет автоматически добавлена в форму.
После этого пользователю остается только задать название, указать дополнительные параметры запуска новой программы и добавить ей описание. Есть один нюанс — для того, чтобы иметь возможность сворачивать разделы, следует все относящиеся к данному разделу программы просто перетащить на название нужной группы. После этого рядом с названием появится значок «+». Теперь, после нажатия на название группы или на плюсик, список будет раскрываться.
Перед выходом из программы необходимо сохранять изменения. Для этого потребуется зайти в меню «Доп. функции» и выбрать пункт «Сохранить конфигурацию». Поиск по фильтру. Если флешка большого объема и хранит много программ и файлов, их список может оказаться достаточно большим. Для облегчения работы с такими списками в программе присутствует функция фильтрации. Чтобы быстро найти нужный элемент, достаточно начать вводить его название. В ответ Linker выдаст список, в котором присутствуют только те записи, в которых встречается введенная пользователем комбинация символов. Чтобы вернуться к общему списку, достаточно убрать введенные символы клавишей Backspace.
Самый известный платный аналог Linker — это CodySafe ($9.90). Программа CodySafe интегрирована с онлайновой базой portable-софта. У Linker такой интеграции нет, однако пользователь может скачать с официального сайта небольшую подборку полезных утилит, названную «Быстрый старт». Из более-менее заметных преимуществ CodySafe перед Linker можно отметить разве что поддержку скинов.



