Что такое компоновка в программировании
Перейти к содержимому

Что такое компоновка в программировании

  • автор:

Компиляция и компоновка программ в С/C++

Когда программисты разговаривают о программировании, они часто говорят: «программа откомпилировалась без ошибок», или, когда говорят программисту: «скомпилируй программу, посмотрим на результат работы». Такие разговорчики позднее могут стать источником путаницы для начинающих программистов. Компиляция и создание исполняемого файла — не синонимы! Создание исполняемых файлов — это многоступенчатый процесс, основные составляющие которого: компиляция и компоновка. На самом деле, даже если программа «откомпилировалась без ошибок», она может не работать из-за возможной ошибки во время стадии компоновки. Весь процесс трансляции файлов исходного кода в исполняемый файл лучше было бы называть построением проекта.

Компиляция!

Компиляция относится к обработке файлов исходного кода (.c, .cc, или .cpp) и создании объектных файлов проекта. На этом этапе не создается исполняемый файл. Вместо этого компилятор просто транслирует высокоуровневый код в машинный язык. Например, если вы создали (но не скомпоновали) три отдельных файла, у вас будет три объектных файла, созданные в качестве выходных данных на этапе компиляции. Расширение таких файлов будет зависеть от вашего компилятора, например *.obj или *.o. Каждый из этих файлов содержит машинные инструкции, которые эквивалентны исходному коду. Но вы не можете запустить эти файлы! Вы должны превратить их в исполняемые файлы операционной системы, только после этого их можно использовать. Вот тут за дело берётся компоновщик.

Компоновка!

Из нескольких объектных файлов создается единый исполняемый файл. На этом этапе полученный файл является единственным, а потому компоновщик будет жаловаться на найденные неопределенные функции. На этапе компиляции, если компилятор не мог найти определение для какой-то функции, считается, что функция была определена в другом файле. Если это не так, компилятор об этом знать не будет, так как не смотрит на содержание более чем одного файла за раз. Компоновщик, с другой стороны, может смотреть на несколько файлов и попытаться найти ссылки на функции, которые не были упомянуты.

Вы спросите, почему этапы компиляции и компоновки разделены. Во-первых, таким образом легче реализовать процесс построения программ. Компилятор делает свое дело, а компоновщик делает свое дело — посредством разделения функций, сложность программы

снижается. Другим (более очевидным) преимуществом является то, что это позволяет создавать большие программы без необходимости повторения шага компиляции каждый раз, когда некоторые файлы будут изменены. Вместо этого, используется так называемая «условная компиляция». То есть объекты составляются только для тех исходных файлов, которые были изменены, для остальных, объектные файлы не пересоздаются. Тот факт, что каждый файл компилируется отдельно от информации, содержащейся в других файлах,

существует благодаря разделению процесса построения проекта на этапы компиляции и компоновки.

Интегрированная среда разработки (IDE) эти два этапа берёт на себя и вам не стоит беспокоиться о том, какие из файлов были изменены. IDE сама решает,когда создавать объекты файлов, а когда нет.

Зная разницу между фазами компиляции и компоновки вам будет намного проще находить ошибки в своих проектах. Компилятор отлавливает, как правило, синтаксические ошибки — отсутствие точки с запятой или скобок. Если вы получаете сообщение об ошибке, множественного определения функции или переменной, знайте, вам об этом сообщает компоновщик. Эта ошибка может означать только одно, что в нескольких файлах проекта определены одна и та же функция или переменная.

Компоновка программы

После устранения ошибок и получения объектного модуля можно приступать к сле- дующему этапу — созданию исполняемого (загрузочного) модуля, или, как еще называют этот процесс, к компоновке программы.

Главная цель этого этапа — пре- образовать код и данные в объектных файлах в их перемещаемое выполняемое отображение. Чтобы понять, в чем здесь суть, нужно разобраться, зачем вообще разделяют процесс создания исполняемого модуля на два этапа — трансляцию и компоновку. Это сделано намеренно, чтобы можно было объединять вместе мо- дули, написанные на одном и том же или на разных языках. Формат объектного файла позволяет при определенных условиях объединить несколько отдельно от- транслированных исходных модулей в один модуль. При этом в функции компо- новщика входит разрешение внешних ссылок (ссылок на внешние процедуры и пе- ременные) в этих модулях. Результатом работы компоновщика является создание загрузочного файла с расширением .ехе. После этого операционная система может загрузить такой файл в память и выполнить его.

Полный формат командной строки для запуска компоновщика довольно сло- жен (в этой и в большинстве следующих глав мы в основном будем использовать упрощенный формат): ТLINК [ключи] список_объектных_файлов [.имя_заrрузочного_модуля] [.имя_файла_карты] [,имя_файла_библиотеки] [,имя_файла_определений] [,имя_ресурсноrо_файла] Параметры командной строки для запуска компоновщика перечислены далее. ϋ ключи — необязательные параметры, управляющие работой компоновщика. Список наиболее часто используемых ключей приведен в приложении В (http: / / www.piter.com/download). Каждому ключу должен предшествовать символ — (де- фис) или / (слеш). При задании имен ключей имеет значение регистр символов. ϋ список_объектных_файлов — обязательный параметр, содержащий список ком- понуемых файлов с расширением .obj.

Файлы должны быть разделены пробе- лами или знаком + (плюс), например: ttiлk /v prog + mdf + fdr При необходимости имена файлов снабжают указанием пути к ним. И имя_заrрузочного_модуля — необязательный параметр, обозначающий имя фор- мируемого загрузочного модуля. Если оно не указано, то имя загрузочного мо- дуля будет совпадать с первым именем в списке имен объектных файлов. ii имя_файла_карты — необязательный параметр, наличие которого обязывает ком- поновщик создать специальный файл с картой загрузки. В ней перечисляются имена, адреса загрузки и размеры всех сегментов, входящих в программу. it имя_файла_библиотеки — необязательный параметр, который представляет со- бой путь к файлу библиотеки (.lib). Этот файл создается и обслуживается спе- циальной утилитой tlib.exe пакета TASM. Утилита позволяет объединить часто используемые подпрограммы в виде объектных модулей в один файл. В даль- нейшем можно просто указывать в командной строке tlink.exe имена нужных для компоновки объектных модулей и файл библиотеки, в котором следует искать эти подпрограммы. Если компонуется Windows-приложение, то на мес- те параметра имя_файла_библиотеки должно указываться имя библиотеки им- порта (глава 16). » имя_файла_определений — необязательный параметр, который представляет со- бой путь к файлу определений (.def). Этот файл используется при компоновке Windows-приложений (глава 16). ⅞ имя_ресурсного_файла — необязательный параметр, который представляет со- бой путь к файлу с ресурсами Windows-приложения (.rеs). Этот файл исполь- зуется при компоновке Windows-приложений (глава 16). Рассмотренный нами формат командной строки используется и для 32-разряд- ного варианта компоновщика tlink32.exe. Существует возможность задания параметров командной строки компоновщи- ка в текстовом файле. Для этого нужно создать файл с именем tlink.cfg (tliпkЗ2.сfд). При вызове компоновщика tlink.exe с параметром tlink.cfg (tliпkЗ2.ехе tlink32.cfg) ему будет передано содержимое файла tlink.cfg (tliпkЗ2.сfд). Например, текст кон- фигурационного файла tlink32.cfg для создания исполняемого файла Windows- приложения с отладочной информацией должен выглядеть так: /V /Тwе. Так же как и в случае команды tasm.exe, совсем не обязательно запоминать по- дробно синтаксис команды tlink.exe. Для того чтобы получить список ключей про- граммы tlink.exe, достаточно просто запустить ее без параметров. Для выполнения нашего примера запустим программу tlink.exe командной стро- кой вида tlink.exe /v ргg_6_l.obj В результате вы получите исполняемый модуль с расширением .ехе — prg_6_l.exe. Получив исполняемый модуль, не спешите радоваться. К сожалению, устране- ние синтаксических ошибок еще не гарантирует, что программа будет хотя бы за- пускаться, не говоря уже о ее правильной работе. Поэтому обязательным этапом процесса разработки является отладка.

Ассемблер. Компиляция и компоновка

В этой статье мы рассмотрим процессы компиляции и компоновки программ на языке ассемблер для для операционных систем DOS и Windows. Напомню что компиляция — это процесс перевода файлов программы в так называемые объектные файлы. Объектные файлы — это файлы, в которых находится почти готовая программа в виде разрозненных кусков кода, связанных некоторой служебной информацией. Чтобы превратить эти куски кода в готовую программу используется компоновщик. Он выстраивает код в исполняемом файле в нужном порядке и создает готовый файл заданного формата. Этот получившийся файл уже можно исполнять.

Начнем с компиляции под DOS

В DOS существовало два вида исполняемых файлов: *.com и *.exe. Файлы *.com характеризуются тем, что весь код программы, данные и место для стека содержится в одном сегменте памяти, причем код программы должен находиться в сегменте со смещением в 256 байт (100h). Файлы формата *.exe не имеют ограничений на количество используемых сегментов памяти.

Для компиляции под DOS я использую компилятор MASM версии 6.11 и TASM версии 5.3

Компиляция и компоновка файлов *.com с помощью TASM:

\tasm32\bin\tasm53.exe test.asm, test.obj, test.lst /z /t /ml /m2 /l \tasm32\bin\tlink.exe test.obj /x /t /3

Компиляция и компоновка файлов *.exe с помощью TASM:

\tasm32\bin\tasm53.exe test.asm, test.obj, test.lst /z /t /ml /m2 /l \tasm32\bin\tlink test.obj, test.exe /x /3

Описание всех параметров можно получить, выполнив в командной строке tasm53.exe /? и tlink.exe /?

Компилятор MASM позволяет выполнять компиляцию и компоновку через вызов своей программы-оболочки ml.exe

Компиляция файлов *.com с помощью MASM:

\masm611\bin\ml.exe test.asm /AT /Fl /link

Компиляция файлов *.exe с помощью MASM:

\masm611\bin\ml.exe test.asm /Fl /link

Компиляция под Windows

Для компиляции под Windows используются компилятор MASM32 и TASM32.

Компиляция и компоновка файлов *.exe с помощью TASM32:

\tasm32\bin\tasm32.exe test.asm, test.obj, test.lst /zi /t /ml /m3 /q \tasm32\bin\tlink32 /x /Tpe /ap /c /V4.0 test.obj, test.exe, , user32.lib

Компиляция файлов *.exe с помощью MASM32:

\masm32\bin\ml.exe /c /coff test.asm \masm32\bin\link.exe /SUBSYSTEM:WINDOWS test.obj

После компиляции и компоновки у вас должен получиться исполняемый файл *.exe или *.com формата, в зависимости от того, какие параметры вы задавали компилятору.

C++: Компиляция и компоновка (линковка)

С++ — компилируемый язык. Поэтому прежде чем запускать написанную программу, нам нужно превратить текстовые файлы с исходным кодом в машинный код, который понятен компьютеру.

В этом уроке мы узнаем, что такое компилятор. Также разберем, как происходит процесс компиляции, который можно разбить на две стадии: компиляция и компоновка.

Компиляция

Чтобы скомпилировать программу на C++, мы используем специальную программу. Она последовательно просматривает каждый файл исходного кода (.cpp) и выполняет две важные задачи:

  1. Проверяет код на соответствие правилам языка C++. В противном случае компилятор выдаст ошибку и номер соответствующей строки, чтобы помочь точно определить, что нужно исправить. Процесс компиляции будет прерван, пока ошибка не будет исправлена
  2. Переводит исходный код C++ в файл машинного кода, называемый объектным файлом

Объектные файлы обычно имеют имена name.o или name.obj , где name совпадает с именем файла .cpp , из которого он был создан.

Если бы в вашей программе было бы три файла .cpp , компилятор сгенерировал бы три объектных файла.

Компиляторы C++ доступны для многих операционных систем. Например, в стандартной поставке многих дистрибутивов Linux есть компилятор gcc. В Windows можно пользоваться IDE Visual Studio — в нее уже встроен компилятор и система сборки.

Компоновка

После того, как компилятор создал один или несколько объектных файлов, включается другая программа — компоновщик или линкер. Работа компоновщика состоит из трех частей:

  1. Берет все объектные файлы, сгенерированные компилятором, и объединяет их в единую исполняемую программу
  2. Помимо возможности связывать объектные файлы компоновщик также может связывать файлы библиотек. Файл библиотеки — это набор предварительно скомпилированного кода, который был упакован для повторного использования в других программах
  3. Обеспечивает правильное разрешение всех межфайловых зависимостей. Например, если мы определяем что-то в одном файле .cpp , а затем используем это в другом файле .cpp , компоновщик соединит их вместе. Если компоновщик не может связать ссылку с чем-то с ее определением, мы получим ошибку компоновщика, и процесс линковки прервется

Системы сборки

Когда проект содержит десятки и даже сотни файлов с исходным кодом, процесс его сборки надо автоматизировать. Здесь на помощь приходят системы сборки, которые автоматически запускают все нужные команды, чтобы скомпилировать и скомпоновать все файлы проекта. В итоге на выходе получается один исполняемый файл.

Одной из таких систем является утилита Make и Makefile . В Makefile описываются все цели и зависимости проекта, а утилита Make смотрит в этот файл и запускает компилятор с соответствующими командами.

Еще одна популярная система сборки проектов — утилита CMake , которая работает поверх Make . Она отличается своей кроссплатформенностью и позволяет делать сборки под различные операционные системы.

Компиляции и сборка программы не менее важный процесс, чем написание самой программы.

Задание

Выведите на экран число 9780262531962.

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное

  • «Если в редакторе есть запись // BEGIN и // END , то код нужно писать между этими строчками.»
  • Установка gcc в Windows
  • gcc для Linux

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *