Компиляция и сборка glukos


Содержание

Компиляция и установка пакетов из исходного кода с помощью Make

Вступление

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

Данное руководство охватывает вопросы компиляции и установки cURL из исходного кода. Использованный здесь синтаксис применим на большинстве дистрибутивов.

Требования

Для компиляции исходного кода в Linux нужен пакет «build-essential» (в системах на основе Debian) или «Development Tools» (CentOS); данные пакеты содержат компиляторы и библиотеки gcc/g++.

Чтобы установить пакет на Debian и Ubuntu, используйте:

apt-get install build-essential

yum groupinstall «Development Tools»

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

Перед компилированием cURL установите все необходимые зависимости. Также на используемом сервере нужно иметь привилегии root или sudo для установки и компилирования исходного кода.

Извлечение и компилирование исходного кода на VPS

Загрузка Tarball

Для начала нужно скачать исходный код cURL. Существует множество способов это сделать, но в данном руководстве используется tarball, доступный на сайте cURL. При желании URL в следующей команде можно заменить на URL текущей версии cURL, но при этом нужно помнить, что это должна быть ссылка на файл «tar.gz». Запустите:

Это скачает и сохранит исходный код как curl.tar.gz в текущем каталоге.

Теперь нужно извлечь tarball. Для этого запустите:

tar -xvzf curl.tar.gz

Исходный код будет расположен в папке по имени «curl-» с номером версии. При вводе:

будет выведен подобный результат:

/curl ls
curl-7.32.0 curl.tar.gz

В данном случае папка называется «curl-7.32.0», следовательно, чтобы войти в эту папку, нужно ввести:

Конфигурирование и компилирование исходного кода

В этой папке можно найти множество разных файлов. На данный момент нужно обратить внимание на файл «configure». Это скрипт, созданный для того, чтобы помочь запустить программу на различных компьютерах. Запустите:

Это автоматически использует переменные текущей системы, чтобы подготовить исходный код для данного VPS. В основном эта команда проверяет, соответствуют ли библиотеки, установленные в системе, тем, что нужны программе. Данное действие указывает компилятору, где искать библиотеки, нужные исходному коду, в данном случае cURL. Кроме того, данное действие определяет, куда впоследствии установить пакет. По завершению будет создан файл Makefile со всей нужной в нем информацией. Теперь все готово для компилирования исходного кода. Для этого запустите команду:

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

Теперь make будет следовать инструкциям в «Makefile», чтобы установить скомпилированные пакеты. В большинстве случаев это все, что нужно для установки. Теперь можно ввести curl. Если cURL был установлен верно, будет выведен примерно такой результат:

curl: try ‘curl —help’ or ‘curl —manual’ for more information

При извещении об ошибке bash введите:

ln -s /usr/local/bin/curl /usr/bin/curl

Это создаст ссылку на /usr/bin/curl, которая соединяется с /usr/local/bin/curl. Это позволит запустить cURL, просто введя curl в консоль. Обычно это выполняется автоматически, но в некоторых случаях скрипт конфигурации не может найти нужное местоположение установки. Теперь можно ввести:

Это запустит текущую версию cURL. Выведенный результат имеет примерно такой вид:

/curl curl -V
curl 7.32.0 (x86_64-unknown-linux-gnu) libcurl/7.26.0 OpenSSL/1.0.1e zlib/1.2.7 libidn/1.25 libssh2/1.4.2 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp rtsp scp sftp smtp smtps telnet tftp
Features: Debug GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP

Готово! cURL был успешно скомпилирован и установлен из исходного кода.

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

Запомните последовательность: ./configure, затем make, а затем make install.

Компиляция и сборка glukos

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

Тема собственно родилась по просьбе одного хорошего человека, который попросил вынести в отдельный топик. Буду собирать для примера geany на голом только что установленном дистрибутиве Debian squeeze с Gnome на борту. «Почему geany? Он же есть в репозитории.» — спросите вы. Просто это первая программа которую собрал в linux, так сказать ностальгия.

Readme

Так к чему я это? К тому что обычно пишется «как собрать» в файле Readme или Install, прежде чем делать что-то посмотрите в этот файл, наверняка там написан не только процесс установки, но и зависимости которые нужны для пакета.

Обычно все сводится к выполнению

Скачиваем geany

Можно скачать по ссылке, а можно воспользоваться консольной утилитой wget, если вы не выполняли команду «cd» до этого, то скачается в ваш корневой каталог пользователя /home/user.

Распаковываем

Можно распаковать как угодно, и каким угодно «архиватором», предлагаю сделать это так

Переходим в распакованную директорию

Установка необходимых пакетов для сборки

В дальнейшем ставить уже не надо будет


Сборка классическим make, make install

Конфигурация

Не буду описывать различные префиксы, их можно посмотреть в help, но если вы собираете впервые, то оно вам не нужно.
./configure —help. В большинстве случаев достаточно ./configure без префиксов.

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

На данном этапе мы получили сообщение

Гуглим «ошибку» или ищем сразу в репозитории. Тут нужно поставить девелоперский пакет libgtk.

Выполняем поиск и смотрим список

Теперь повторяем опять

В итоге получили сообщение что все гуд, если нет, устанавливаем дальше необходимые пакеты по такому же принципу.

Сборка и установка

Переходим непосредственно к самой сборке, выполнив для компиляции

Получили примерно вот такой лог

Если с ошибкой, значит гуглим ошибку, потом повторяем. Но на этом этапе ошибки возможны как правило только с еще сильно нестабильным софтом, тут скорей всего помочь может только багрепорт разработчику.

Если все хорошо, теперь можно выполнить от root, или с префиксом sudo

Смотрим наш только что установленный редактор

На этом все. Архив tar.gz2 и каталог geany который был извлечен из архива можно удалить, выполнив последовательно

Перейти в корень /home/user

Сборка пакетов для установки при помощи пакетного менеджера

Говорят что после классической установки возможны проблемы с удалением программы. Не знаю, с этим не сталкивался все без проблем удалялось, но не утверждаю что это не имеет место быть.

Для решения этих проблем есть утилита checkinstall которая сначала создает пакет .deb, .rpm, а потом его уже устанавливает. После сборки пакета при помощи checkinstall не желательно давать его кому-то еще, эта утилита сделана исключительно для удобства работы на отдельно взятом компьютере.

Выполняем все то же, что и в классическом варианте, но с некоторыми изменениями.

Сheckinstall

Ставим сначала пакет checkinstall для сборки

Конфигурация

Конфигурируем, устанавливая необходимые пакеты как было выше.

Собираем пакет и устанавливаем

Теперь вместо make install выполняем checkinstall, конечно тоже от root или с префиксом sudo.

Далее нас попросят ответить на несколько вопросов

1. Enter
2. Enter
3. Заполняем, уточню, это не обязательные поля, можно смело пропустить, если пакет больше использоваться не будет.

  • [0] Maintainer — пишем ваш email
  • [10] Requires — Зависимости пакета, тут нужно указать не девелоперские пакеты (!-dev), в нашем случае это libgtk2.0 для любой другой программы этот список может быть достаточно большим.

4. Если решили что все в порядке, продолжаем нажав «Enter». Новый созданный пакет будет лежать в этой же директории, в нашем случае

/geany-0.20, а так же установлен в системе.

NOTE: Для checkinstall мне пришлось поставить еще apt-build т.к. его не было в системе.
FAQ по checkinstall

Компиляция и сборка glukos

Есть всего три популярных, высококачественных, широко принятых в индустрии компиляторов C/C++:

  • GCC (Gnu Compiler Collections и GNU C Compiler), кроссплатформенный и Open-Source, используется в Linux как основной, на Windows известен как MinGW
  • MSVC (Microsoft Visual C/C++), низкая кроссплатформенность и закрытый код, используется в Windows как основной
  • LLVM/Clang, кроссплатформенный и Open-Source, используется в Mac OSX как основной, на Windows умеет быть совместимым и с MinGW, и с MSVC, доступен в Visual Studio 2015 и выше в модификации Clang/C2

Принципы работы GCC и Clang можно детально исследовать благодаря открытому исходному коду и отладочным средствам.

GCC (компиляция и вывод ассемблера)

Разберёмся, как использовать GCC из командной строки. На UNIX-платформах GCC доступен по команде gcc , а для Windows есть порт GCC — MinGW. Воспользуемся примером кода, складывающего два числа:

Компиляция файла из командной строки с опциями по умолчанию (отладочная сборка без оптимизаций):

Вывод программы после запуска:

Получение ассемблерного кода для отладочного режима без оптимизаций возможно с опцией -S . По умолчанию создаваемый ассемблер использует синтаксис AT&T, который заметно отличается от синтаксиса Intel.

Можно получить ассемблерный код в режиме с оптимизациями, используя флаг -O2 , где “O” в верхнем регистре. Если сравнить отладочный и оптимизированный код с помощью утилиты diff, будут видны сильные отличия в цепочках инструкций.

Вы можете скомпилировать ассемблер с помощью того же gcc, который сам передаст нужные параметры утилите “gas” (GNU Assembler).

Clang (компиляция, вывод ассемблера и LLVM-IR)

Clang разрабатывался как прозрачная замена компилятору GCC для Linux и Mac OSX. Поэтому большая часть опций, касающихся компиляции C/C++, у этих двух компиляторов совпадает. Компиляция примера на языке C выглядит точно так же:


Генерация ассемблера с синтаксисом Intel:

Бекенды GCC и Clang

GCC и Clang оба используют гибкие фреймворки для построения бекендов компилятора. В GNU Compiler Collections используется собственный промежуточный язык и бекенд GIMPLE, который сильно упрощает написание компиляторов для новых языков в составе GNU Compiler Collections, но плохо подходит для изучения новичком. Проект LLVM гораздо дружественнее к новичкам и студентам, и именно его использует компилятор Clang.

Вы можете изучать промежуточный код проекта LLVM, называемый LLVM-IR, с помощью clang, исследуя преобразование кода из C в LLVM-IR:

Илон Маск рекомендует:  Картинка с тенью

Упражнения

  • Напишите 3-4 простейших программы в 10-20 строк на C (сложение двух чисел, вывод текущего времени с начала эпохи UNIX, вывод версии операционной системы, переворачивание строки т.п.). Сгенерируйте из этих программ листинги в машинном ассемблере либо в LLVM-IR, и сравните листинги от разных программ с помощью diff. Попробуйте собрать минимальный шаблон ассемблерного кода, который можно было бы разворачивать в полноценную программу путём подстановки цепочки инструкций вместо переменной .

PS-Group

Материалы для курсов в Институте Программных Систем и в Волгатехе

KNZSOFT Разработка ПО, консультации, учебные материалы

Князев Алексей Александрович. Независимый программист и консультант.

С++ для начинающих. Урок 1. Компиляция

    Содержание

Обзор компиляторов

Существует множество компиляторов с языка C++, которые можно использовать для создания исполняемого кода под разные платформы. Проекты компиляторов можно классифицировать по следующим критериям.

  1. Коммерческие и некоммерческие проекты
  2. Уровень поддержки современных тенденций и стандартов языка
  3. Эффективность результирующего кода

Если на использование коммерческих компиляторов нет особых причин, то имеет смысл использовать компилятор с языка C++ из GNU коллекции компиляторов (GNU Compiler Collection). Этот компилятор есть в любом дистрибутиве Linux, и, он, также, доступен для платформы Windows как часть проекта MinGW (Minumum GNU for Windows). Для работы с компилятором удобнее всего использовать какой-нибудь дистрибутив Linux, но если вы твердо решили учиться программировать под Windows, то удобнее всего будет установить некоммерческую версию среды разработки QtCreator вместе с QtSDK ориентированную на MinGW. Обычно, на сайте производителя Qt можно найти инсталлятор под Windows, который сразу включает в себя среду разработки QtCreator и QtSDK. Следует только быть внимательным и выбрать ту версию, которая ориентирована на MinGW. Мы, возможно, за исключением особо оговариваемых случаев, будем использовать компилятор из дистрибутива Linux.

GNU коллекция компиляторов включает в себя несколько языков. Из них, группу языков Си составляет три компилятора.

  1. g++ — компилятор с языка C++.
  2. gcc — компилятор с языка C (GNU C Compiler).
  3. gcc -lobjc — Objective-C — это, фактически, язык C с некоторой макро-магией, которая доступна в объектной библиотеке objc. Ее следует поставить и указать через ключ компиляции -l.

Этапы компиляции

Процесс обработки текстовых файлов с кодом на языке C++, который упрощенно называют «компиляцией», на самом деле, состоит из четырех этапов.

  1. Препроцессинг — обработка текстовых файлов утилитой препроцессора, который производит замены текстов согласно правилам языка препроцессора C/C++. После препроцессора, тексты компилируемых файлов, обычно, значительно вырастают в размерах, но теперь в них содержится все, что потребуется компилятору для создания объектного файла.
  2. Ассемблирование — процесс превращения текста на языке C++ в текст на языке Ассемблера. Для компиляторов GNU используется синтаксис ассебмлера AT&T.
  3. Компилирование — процесс превращения текстов на языке Ассемблера в объектные файлы. Это файлы состоящие из кодов целевого процессора, но в которых еще не проставлены адреса объектов, которые находятся в других объектных файлах или библиотеках.
  4. Линковка — процесс объединения объектных файлов проекта и используемых библиотек в единую целевую сущность для целевой платформы. Это может быть исполняемая программа или библиотека статического или динамического типа.

Рассмотрим подробнее упомянутые выше стадии обработки текстовых файлов на языке C++.

Препроцессинг

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

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

На входе препроцессора мы имеем исходный файл с текстом на языке C++ включающим в себя элементы языка препроцессора.

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

Ассемблирование

Процесс ассемблирования с одной стороны достаточно прост для понимания и с другой стороны является наиболее сложным в реализации. По своей сути это процесс трансляции выражений одного языка в другой. Более конкретно, в данном случае, мы имеем на входе утилиты ассемблера файл с текстом на языке C++ (компиляционный лист), а на выходе мы получаем файл с текстом на языке Ассемблера. Язык Ассемблера это низкоуровневый язык который практически напрямую отображается на коды инструкций процессора целевой системы. Отличие только в том, что вместо числовых кодов инструкций используется англоязычная мнемоника и кроме непосредственно кодов инструкций присутствуют еще директивы описания сегментов и низкоуровневых данных, описываемых в терминологии байтов.

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

Компиляция

В данном случае, мы имеем компилятор с языка ассемблера. Результатом его работы является объектный файл полученный на основе всего того текста, что был предоставлен в компиляционном листе. Поэтому можно говорить, что каждый объектный файл проекта соответствует одному компиляционному листу проекта.

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

Вообще, разница между объявлением (declaration) и определением (definition) состоит в том, что объявление (declaration) говорит об имени сущности и описывает ее внешний вид — например, тип объекта или параметры функции, в то время как определение (definition) описывает внутреннее устройство сущности: класс памяти и начальное значение объекта, тело функции и пр.

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

Линковка

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

Средства сборки проекта

Традиционно, программа на языке C++ собирается средствами утилиты make исполняющей сценарий из файла Makefile. Сценарий сборки можно писать самостоятельно,
а можно создавать его автоматически с помощью всевозможных средств организации проекта. Среди наиболее известных средств организации проекта можно указать следующие.

  1. GNU Toolchain — Старейшая система сборки проектов известная еще по сочетанию команд configure-make-«make install».
  2. CMake — Кроссплатформенная система сборки, которая позволяет не только создать кроссплатформенный проект но и создать сценарий компиляции под любые известные среды разработки, для которых написаны соответствующие генераторы сценариев.
  3. QMake — Достаточно простая система сборки, специально реализованная для фреймворка Qt и широко используемая именно для сборки Qt-проектов. Может быть использована и просто для сборки проектов на языке C++. Имеет некоторые проблемы с выявлением сложных зависимостей метакомпиляции, специфической для Qt, поэтому, даже в проектах Qt, рекомендуется использование системы сборки CMake.


Современные версии QtCreator могут работать с проектами, которые используют как систему сборки QMake, так и систему сборки CMake.

Простой пример компиляции

Рассмотрим простейший проект «Hello world» на языке C++. Для его компиляции мы будет использовать консоль, в которой будем писать прямые команды компиляции. Это позволит нам максимально прочувствовать описанные выше этапы компиляции. Создадим файл с именем main.cpp и поместим в него следующий текст программы.

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

В первой строке кода записана директива включения файла с именем iostream в текст проекта. Как уже говорилось, все строки, которые начинаются со знака решетки (#) интерпретируются в языках C/C++ как директивы препроцессора. В данном случае, препроцессор, обнаружив директиву включения файла в текст программы, директиву include, выполнит включение всех строк указанного в директиве файла в то место программы, где стоит инструкция include. В результате этого у нас получится большой компиляционный лист, в котором будут присутствовать множество символов объявленных (declaration) в указанном файле. Включаемые файлы, содержащие объявления (declaration) называют заголовочными файлами. На языке жаргона можно услышать термины «header-файлы» или «хидеры».

Чтобы увидеть результат препроцессинга можно воспользоваться опцией -E компилятора g++. По умолчанию, в этом случае, результат препроцессинга будет выведен в стандартный поток вывода. Чтобы можно было удобно рассмотреть его, следует перенаправить стандартный поток вывода в какой-нибудь текстовый файл. В представленном ниже примере это будет файл main.E.

В третьей строке программы описана функция main(). В контексте операционной системы, каждое приложение должно иметь точку входа. Такой точкой входа в операционных системах *nix является функция main(). Именно с нее начинается исполнение приложения после его загрузки в память вычислительной системы. Так как операционная система Windows имеет корни тесно переплетенные с историей *nix, и, фактически, является далеким проприентарным клоном *nix, то и для нее справедливо данное правило. Поэтому, если вы пишете приложение, то начинается оно всегда с функции main().

При вызове функции main(), операционная система передает в нее два параметра. Первый параметр — это количество параметров запуска приложения, а второй — строковый массив этих параметров. В нашем случае, мы их не используем.

В пятой строке мы обращаемся к предопределенному объекту cout из пространства имен std, который связан с потоком вывода приложения. Используя синтаксис операций, определенных для указанного объекта, мы передаем в него строку «Hello world» и символ возврата каретки и переноса строки.

В седьмой строке мы возвращаем код 0, как код возврата функции main(). В организации процессов в операционной системы, это число будет восприниматься как код возврата приложения.

Следующим шагом проведения эксперимента выполним останов компиляции файла main.cpp после этапа ассемблирования. Для этого воспользуемся ключом -S для компилятора g++. Здесь и далее, знак доллара ($) обозначает стандартное приглашение к вводу команды в консоли *nix. Писать знак доллара не требуется.

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

Для остановки компиляции после, собственно, компиляции следует воспользоваться ключом -c для компилятора g++.

Наконец, если нас не интересуют эксперименты с остановками компиляции на разных этапах и если мы просто хотим получить из нашего файла на языке C++ исполняемую программу, то следует выполнить следующую команду.

В результате исполнения этой команды появится файл a.out который и представляет собой результат компиляции — исполняемый файл программы. Запустим его и посмотрим на результат выполнения. При работе в операционной системе Windows, результатом компиляции будет файл с расширением exe. Возможно, он будет называться main.exe.

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

Для отправки комментария вам необходимо авторизоваться.

Компиляция, компоновка и выполнение проекта

Компиляция (compilation) – это преобразование программы или ее отдельного модуля, текст которых составлен на языкепрограммирования высокого уровня (исходная программа, исходный модуль – это файл с расширением .срр) в программу или модуль намашинном языке или на языке, близком к машинному (получаютобъектный модуль – файл с расширением .obj). Компиляцию осуществляет специальная программа –компилятор (compiler), которая является неотъемлемой частью системы программирования. На вход компилятора поступаетисходный модуль (файл .срр), который после компиляции преобразуется в объектный модуль (файл .obj)

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

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

Существуют различные виды компиляторов:

интерпретирующие (пошаговые), осуществляющие последовательную независимую компиляцию каждой отдельной инструкцииисходной программы;

оптимизирующие, осуществляющие повышение эффективности объектных модулей, например, за счет вынесения из циклов последовательности команд, результаты действий которых не меняются при повторении циклов;

отладочные, облегчающие пользователю отладку программ.

Компоновка, редактирование связей (linking, linking editing) – это процесс сборкизагрузочного модуля (исполняемого файла) из полученных в результате раздельной компиляцииобъектных модулей с одновременным автоматическим поиском и присоединениембиблиотечных подпрограмм и процедур. В процессе компоновки программа собирается в единое целое непосредственно в оперативной памяти в файл, готовый к работе (загрузочный модуль — файл с расширением .ехе).

Работу по компоновке программы выполняет программа компоновщик (linker). Эта программа выполняет следующие основные функции:

распределяет пространство оперативной памяти для программы;

связывает вместе части программы, представленные отдельными объектными модулями (файлами .obj);

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

Компоновщики бывают в двух реализациях:

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

компоновщики, которые готовят загрузочный файл, сразу физически размещают подготовленную версию машинного кода программы в памяти и передают управление на первую команду программы для непосредственного исполнения.

Эти операции могут быть выполнены с помощью меню Build.

Краткое описание основных команд этого меню:

Сompile– компиляция выбранного файла, результат компиляции отображаются в окнахTask ListиOutput.

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

Rebuild делается то же, что и в командеBuild, но при выполнении этой команды компилируются все файлы проекта независимо от того, были ли в них изменения.

Эти операции могут быть выполнены и с помощью меню Debug, его команд Start или Start Without Debugging. Эти две команды делают все то же, что и командаBuild, сразу же запуская файл с расширением.ехе.

Запустите ваш проект, выполнив команду StartменюDebug. Появляется выпадающее диалоговое окно, в котором нам задается вопрос:Would you like to build them? Вопрос задается вам, так как вы не выполняли отдельно процедуру компоновки программыBuild, а ее необходимо выполнить. Согласитесь на ее выполнение, ответив «Да». Так как программа, которую вы скопировали, не имеет ошибок, то появляется черное консольное окно[run], в котором начинает работать ваша программа.

Введите два числа – первое обязательно целое, второе любое. Получите результат.

Сверните главное окно Microsoft Visual Studio.Net и разверните свое окно. В вашей папке появилась новая папкаDebug.В этой папке появились новые файлы, среди них файлMyFirstProject.exe (исполняемый файл). Запустите его, щелкнув по его пиктограмме.

Разверните снова главное окно Microsoft Visual Studio.Net. Закройте свой проект, выбрав в менюFile командуClose Solution. Закрыть проект можно просто, закрыв главное окно.

Linux с самых основ (компиляция, установка ядра и тд)

Всю жизнь пользовался Windows, и что-то внезапно захотелось немного познакомиться с Linux. Хочется разобраться со всем этим делом с самых-самых основ, но чувствую что не хватает некоторого понимания и теоретических познаний и представлений. Есть ряд вопросов, ответы на которые, как мне кажется, могут немного заполнить пробелы в моем понимании того, что такое Linux и с чем его едят. Итак:

  • Правильно ли я понимаю, что есть одно единственное и неповторимое ядро Linux, на базе которого разработаны все эти многочисленные дистрибутивы (Ubuntu, Debian, Mint и т.д), и при этом можно установить именно это самое чистое ядро, а не какой-то из дистрибутивов?
  • Правильно ли я понимаю, что само по себе ядро это уже по сути ОС, только без графического интерфейса (что-то вроде DOS) а сам GUI-интерфейс можно уже установить отдельно?
  • Слышал много раз о том, что ядро в начале обычно нужно скомпилировать, а затем установить. Есть ли возможность получить уже скомпилированное ядро, распространяется ли оно в таком виде? Хорошая ли идея — пытаться скомпилировать это самое ядро Linux на Windows, и насколько это вообще возможно?
  • Слышал много раз о всяких менеджерах пакетов, при помощи которых осуществляется установка различного софта в системах на базе Linux, при этом у каждой такой ОС (Ubuntu, Debian, Mint и т.д) свои собственные менеджеры пакетов. А как быть с чистым ядром? Каким образом на него что-то ставится? Каким вообще образом распространяется софт для Linux? Только в open source, с последующей компиляцией? А такие штуки как установочные файлы, .exe-шники и прочее — обычно не используется?
  • Если есть только один ПК без установленной ОС, как обычно на него устанавливается ядро Linux?


Сборка или компиляция программ из исходников в linux

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

Тема собственно родилась по просьбе одного хорошего человека, который попросил вынести в отдельный топик. Буду собирать для примера geany на голом только что установленном дистрибутиве Debian squeeze с Gnome на борту. «Почему geany? Он же есть в репозитории.» — спросите вы. Просто это первая программа которую собрал в linux, так сказать ностальгия.

Так к чему я это? К тому что обычно пишется «как собрать» в файле Readme или Install, прежде чем делать что-то посмотрите в этот файл, наверняка там написан не только процесс установки, но и зависимости которые нужны для пакета.

Обычно все сводится к выполнению

Можно скачать по ссылке, а можно воспользоваться консольной утилитой wget, если вы не выполняли команду «cd» до этого, то скачается в ваш корневой каталог пользователя /home/user.

Можно распаковать как угодно, и каким угодно «архиватором», предлагаю сделать это так

Переходим в распакованную директорию

Установка необходимых пакетов для сборки

В дальнейшем ставить уже не надо будет

Сборка классическим make, make install

Не буду описывать различные префиксы, их можно посмотреть в help, но если вы собираете впервые, то оно вам не нужно.
./configure —help. В большинстве случаев достаточно ./configure без префиксов.

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

На данном этапе мы получили сообщение

Гуглим «ошибку» или ищем сразу в репозитории. Тут нужно поставить девелоперский пакет libgtk.

Выполняем поиск и смотрим список

Теперь повторяем опять

В итоге получили сообщение что все гуд, если нет, устанавливаем дальше необходимые пакеты по такому же принципу.

Сборка и установка

Переходим непосредственно к самой сборке, выполнив для компиляции

Получили примерно вот такой лог

Если с ошибкой, значит гуглим ошибку, потом повторяем. Но на этом этапе ошибки возможны как правило только с еще сильно нестабильным софтом, тут скорей всего помочь может только багрепорт разработчику.

Если все хорошо, теперь можно выполнить от root, или с префиксом sudo

Смотрим наш только что установленный редактор

На этом все. Архив tar.gz2 и каталог geany который был извлечен из архива можно удалить, выполнив последовательно

Перейти в корень /home/user

Сборка пакетов для установки при помощи пакетного менеджера

Говорят что после классической установки возможны проблемы с удалением программы. Не знаю, с этим не сталкивался все без проблем удалялось, но не утверждаю что это не имеет место быть.

Для решения этих проблем есть утилита checkinstall которая сначала создает пакет .deb, .rpm, а потом его уже устанавливает. После сборки пакета при помощи checkinstall не желательно давать его кому-то еще, эта утилита сделана исключительно для удобства работы на отдельно взятом компьютере.

Выполняем все то же, что и в классическом варианте, но с некоторыми изменениями.

Ставим сначала пакет checkinstall для сборки

Конфигурируем, устанавливая необходимые пакеты как было выше.

Собираем пакет и устанавливаем

Теперь вместо make install выполняем checkinstall, конечно тоже от root или с префиксом sudo.

Далее нас попросят ответить на несколько вопросов

1. Enter
2. Enter
3. Заполняем, уточню, это не обязательные поля, можно смело пропустить, если пакет больше использоваться не будет.

  • [0] Maintainer — пишем ваш email
  • [10] Requires — Зависимости пакета, тут нужно указать не девелоперские пакеты (!-dev), в нашем случае это libgtk2.0 для любой другой программы этот список может быть достаточно большим.

4. Если решили что все в порядке, продолжаем нажав «Enter». Новый созданный пакет будет лежать в этой же директории, в нашем случае

/geany-0.20, а так же установлен в системе.

NOTE: Для checkinstall мне пришлось поставить еще apt-build т.к. его не было в системе.
FAQ по checkinstall

Свое ядро в *ubuntu, или Зачем и как компилировать ядро в Linux

Вторник, 5 августа 2008

Когда мне говорят о жесточайших тормозах Линукса по сравнению с виндой, установленной на одной и той же машине, я задаю один единственный вопрос: «У вас ядро самосборное или то раздутое до невозможности, что поставляется в дистрибутиве по умолчанию?» Обычно ответ: «Естественно, то что в дистрибутиве!»

Кроме того, при этом воспринимается с огромным удивлением, что для улучшения работы системы не мешало бы пересобрать ядро под свой конкретный компьютер, дабы отключить в нем огромное количество того, что абсолютно не нужно для вашего железа, а лишь тормозит его работу… Сразу возникает резонный вопрос, зачем же разработчики дистрибутива включили в него настолько тормозное ядро, что обычный пользователь, установивший себе этот дистрибутив, должен сам перекомпилировать его. И вопрос вроде бы логичен, да не совсем…

Разработчики дистрибутивов обычно включают в него такое ядро, которое могло бы без проблем распознать максимально возможное железо, как на компьютере, который покупал еще ваш дедушка, дабы в свободное от просмотра новостей по телеку порезаться в «Call of duty», так и новейшую систему, купленную для выжимания максимума из возможностей компьютера. Естественно, при этом ядро получается раздутым донельзя, и при работе жутко тормозит, ибо системе приходится каждый раз «ковыряться» в большой куче записей и драйверов внутри ядра, что не может радовать ни вас, ни ваш компьютер… А компиляция собственного ядра позволяет отключить все ненужное, оставив только необходимую функциональность… Дело в том, что при работе операционной системы Linux, ядро — единственный участок памяти, который не свопуется, поэтому вполне логично сделать его как можно меньше. Надеюсь, я научно-популярно объяснил абсолютную необходимость пересобрания ядра.

Обычно, впервые осознав важность компиляции ядра, начинающие пингвиноводы опускают руки, считая, что для этого необходимо много знаний и времени, и вообще это занятие для красноглазых администраторов, засыпающих лишь на пару часов с ноутбуком под мышкой, и уж точно не для человека, мало пока еще понимающего в Линуксе… Однако, спешу вас уверить, что все весьма просто и не стоит пугаться не самой сложной процедуры. Вам необходимо лишь узнать полную конфигурацию своего компьютера и выделить часок для внимательного конфигурирования ядра. Соберет же ядро программа установки, а вам лишь придется на полчаса предоставить машину в ее полное распоряжение. ��

Итак, как и обещал ранее, расскажу о процессе настройки и компиляции собственного ядра… Поехали!

Первое, что нам понадобится, — это собственно исходники нового ядра, под управлением которого скоро будет работать ваш Линукс. Скачать можно совершенно свободно на http://www.kernel.org. Качать необходимо последнее стабильное ядро (оно обычно первое в списке, там где написано «The latest stable version of the Linux kernel is…»). Советую брать архив tar.bz2, но всего лишь потому, что он меньше по размеру. Если вы уже собирали ядро, то вам можно будет просто докачать заплатки, то есть патчи, чтобы не качать довольно большое по объему ядро целиком… На самом деле, я рекомендую использовать полное ядро, ибо читал, что при заплаточном собирании ядра могут возникать различные проблемы, зачастую напрямую связанные с простой кривизной рук, однако, без соответствующих знаний лучше не рисковать…


Итак, ядро скачано… Задаем команду:

После этого, забрасываем его (скачанный архив) в папку /usr/src. Распаковываем архив командой:

В этой команде xxxxx.tar.bz2 — это название файла архива с ядром… Как только закончится распаковка, ваши исходники будут находиться в каталоге /usr/src/xxxxx.

Прежде, чем приступить к настройке ядра, точно выяснить спецификации вашего компьютера:
1) тип процессора,
2) чипсет материнской платы,
3) тип видеокарты,
4) тип сетевой платы,
5) тип саунд-карты,
6) тип жестких дисков,
7) usb-устройства и прочее…

Далее, перед сборкой ядра необходимо установить сопроводительные пакеты: gcc, libc6-dev, kernel-package, libncurses5-dev, fakeroot и build-essential.

Когда все установлено и изучено, можно приступать собственно к конфигурированию ядра.

Заходим в директорию /boot, и видим там файл примерно такого названия config-2.6.24-19-generic. Он нам и нужен. Копируем его в каталог с исходниками /usr/src/xxxxx и переименовываем его в .config.

Также предварительно открываем файл Makefile, и в строчке «EXTRAVERSION=» дописываем свое название для ядра, например, EXTRAVERSION=-mykernel. Никакой другой функции эта строчка не несет, кроме, как удобства в опознании собственного ядра.

Далее запускаем конфигуратор ядра, для чего, находясь в папке /usr/src/xxxxx, даем команду:

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

Есть еще вариант консольной настройки:

Этот вариант очень полезен только тогда, когда уже имеется сформированный файл настроек .config (можно использовать файл настроек от старого ядра). В этом варианте задаются только вопросы по возможностям, появившимся с той версии ядра, для которой сделан файл настроек.

Если вы хотите, чтобы ядро работало стабильно и максимально быстро, ответственно подойдите к вопросу настройки. Внимательно читайте каждый пункт. Если чего-то не понимаете, то ищите ответы в интернете. Например, здесь, можно найти описание многих настроек и советы по оптимальному их использованию. Кстати, там же в разделе «3.4 Пример настройки ядра» имеется и несколько советов по оптимизации ядра.

После настройки выбираем пункт «Сохранить конфигурацию в новый файл», где указываем имя файла, отличного от .config, например .config_mykernel. Затем переименовываем .config в .config_old. И у вас получается два файла — .config_old и .config_mykernel. Кстати, есть возможность посмотреть различия между стандартной и вашей конфигурацией так:

Теперь копируем вашу конфигурацию .config_mykernel как .config. Т.е. у вас получится три файла конфигурации. При компиляции будет использоваться файл .config. Файлы .config_ubuntu и .config_mykernel нам помогут в будущем для новой компиляции. Это на тот случай, если новое ядро окажется неработоспособным.

Далее приступим к компиляции. Перед этим, нужно очистить мусор командой:

Компиляцию ядра стоит делать под суперпользователем. Для чего становимся рутом и запускаем процесс сборки ядра:

sudo -s -H
make-kpkg —initrd —revision=mykernel.1 kernel_image kernel_headers

в этой строчке mykernel.1 обозначает название ядра. Можно писать все что душе угодно.

Операция компиляции занимает довольно продолжительное время, зависящее от мощности компьютера, у меня оно обычно занимало около получаса…

По окончании процесса создадутся два deb-файла с ядром, сконфигурированным конкретно под ваши нужды. Поздравляю, ядро готово.

Теперь необходимо установить собранное ядро в систему:

sudo dpkg -i linux-image-xxxxx.deb
sudo dpkg -i linux-headers-xxxxx.deb

Замените на точные названия созданных вами deb-файлов. Далее перегружаемся и видим, в меню свое ядро. Если у вас все загрузилось как положено, я думаю, вы сразу ощутите прирост производительности. Однако, если у вас установлена, например, карточка от nVidia, скорее всего на этом все и закончится… У меня, например, после запуска моей версии ядра просто был черный экран и ноль эмоций…

Исправилось это установкой проприетарных драйверов от nVidia. Есть два варианта их установки: под новое ядро (при этом графический сервер будет работать только под вашим ядром (рекомендуется, если вы не планируете работать ни в каком ядре, кроме своего) и под несколько существующих у вас ядер (в таком случае система будет грузиться как в новом, созданном вами ядре, так и в предыдущем). Но это уже совсем другая история…

Сборка или компиляция

У меня есть теоретический вопрос о различии между компиляцией и сборкой. Я программирую в проекте С++, который занимает много времени для сборки, поэтому я сказал, что нужно делать сборку только в тех случаях, когда «я модифицировал любой заголовочный файл». Это правда? Если я добавлю новый атрибут в файл заголовка, тогда мне нужно построить? Недостаточно компиляции?

«Строительство» — это неопределенный термин, который обычно означает весь процесс, предварительную обработку, компиляцию и привязку. Какие части этих процессов нужно переделать после изменения источника, зависит от того, что изменилось. Если вы изменили только один источник .cpp , достаточно перекомпилировать его и снова связать объекты. Если вы измените заголовок .h , все исходные файлы, содержащие этот заголовок, должны быть перекомпилированы, что обычно дорого, поскольку заголовки, связанные с проектом, как правило, включены во многие исходные файлы.

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

Компиляция — это преобразование исходного кода в код объекта.

Связывание — это комбинация объектного кода с библиотеками в необработанный исполняемый файл.

Building — это последовательность, состоящая из компиляции и компоновки, возможно, с другими задачами, такими как создание установщика.

Поэтому вам нужно только (повторно) скомпилировать объектный код, который старше ( «был отредактирован совсем недавно» ), чем исходный файл для связывания исполняемого файла, который содержит самые новые изменения в вашей программе. Фактически, это то, как make решает, следует ли создавать файл.

Компиляция — это процесс преобразования кода высокого уровня в код уровня машины

Здание — это процесс преобразования языка высокого уровня в исполняемый файл. Это будет связано с компиляцией и связыванием.

В случае изменения файла заголовка файл заголовка может повлиять на несколько файлов С++ и, следовательно, для получения окончательного исполняемого файла вам необходимо его создать

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

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

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

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

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

Компиляция просто берет исходные файлы и их включенные заголовочные файлы и генерирует объектный файл для каждого исходного файла. Building также связывает эти файлы вместе для создания вашего исполняемого файла. Поэтому, если вы измените исходный файл, вам нужно построить, если вы хотите, чтобы новый исполняемый файл тестировался. Компиляция просто поможет вам в этом.

Я не уверен, что полностью понял ваш вопрос.

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

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

Сборка и компиляция под Linux

08.07.2015, 20:28

Сборка и компиляция Qt приложения под Windows
Доброго времени суток! Столкнулся с проблемой компиляции проекта в ОС Windows. Дело в том ,что я.

QT компиляция из Windows под Linux
Поделитесь, если не сложно, линком как сие делать.

Компиляция под Windows из Linux
Компиляция под Windows из Linux — возможно ли это? По идее как-то можно с MinGW, есть у кого опыт?

Кросс компиляция под Win из Linux
Я вроде как собрал qmake для компилятора mingw, собрал библиотеки Qt, но компилировать не.

Qt сборка проекта под Linux
Здравствуйте! Имею проект написанный из под Windows. Хочу собрать debug-сборку под Linux.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL