Компиляция программ Linux
Все программы для компьютера представляют собой набор команд процессора, которые состоят из определенного набора бит. Этих команд несколько сотен и с помощью них выполняются все действия на вашем компьютере. Но писать программы непосредственно с помощью этих команд сложно. Поэтому были придуманы различные языки программирования, которые проще для восприятия человеку.
Для подготовки программы к выполнению, специальная программа собирает ее из исходного кода на языке программирования в машинный код — команды процессора. Этот процесс называется компиляция. Linux — это свободное программное обеспечение, а поэтому исходные коды программ доступны всем желающим. Если программы нет в репозитории или вы хотите сделать что-то нестандартное, то вы можете выполнить компиляцию программы.
В этой статье мы рассмотрим, как выполняется компиляция программ Linux, как происходит процесс компиляции, а также рассмотрим насколько гибко вы сможете все настроить.
Подготовка системы
Мы будем компилировать программы, написанные на Си или С++, так как это наиболее используемый язык для программ, которые требуют компиляции. Мы уже немного рассматривали эту тему в статье установка из tar.gz в Linux, но та статья ориентирована больше на новичков, которым нужно не столько разобраться, сколько получить готовую программу.
В этой же статье тема рассмотрена более детально. Как вы понимаете, для превращения исходного кода в команды процессора нужно специальное программное обеспечение. Мы будем использовать компилятор GCC. Для установки его и всех необходимых инструментов в Ubuntu выполните:
sudo apt install build-essential manpages-dev git automake autoconf
Затем вы можете проверить правильность установки и версию компилятора:
Но перед тем как переходить к самой компиляции программ рассмотрим более подробно составляющие этого процесса.
Как выполняется компиляция?
Компиляция программы Linux — это довольно сложный процесс. Все еще сложнее, потому что код программы содержится не в одном файле и даже не во всех файлах ее исходников. Каждая программа использует множество системных библиотек, которые содержат стандартные функции. К тому же один и тот же код должен работать в различных системах, содержащих различные версии библиотек.
На первом этапе, еще до того как начнется непосредственно компиляция, специальный инструмент должен проверить совместима ли ваша система с программой, а также есть ли все необходимые библиотеки. Если чего-либо нет, то будет выдана ошибка и вам придется устранить проблему.
Дальше идет синтаксический анализ и преобразование исходного кода в объектный код, без этого этапа можно было бы и обойтись, но это необходимо, чтобы компилятор мог выполнить различные оптимизации, сделать размер конечной программы меньше, а команды процессора эффективнее.
Затем все объектные файлы собираются в одну программу, связываются с системными библиотеками. После завершения этого этапа программу остается только установить в файловую систему и все. Вот такие основные фазы компиляции программы, а теперь перейдем ближе к практике.
Компиляция программ Linux
Первое что нам понадобиться — это исходники самой программы. В этом примере мы будем собирать самую последнюю версию vim. Это вполне нейтральная программа, достаточно простая и нужная всем, поэтому она отлично подойдет для примера.
Получение исходников
Первое что нам понадобиться, это исходные коды программы, которые можно взять на GitHub. Вы можете найти исходники для большинства программ Linux на GitHub. Кроме того, там же есть инструкции по сборке:
Давайте загрузим сами исходники нашей программы с помощью утилиты git:
git clone https://github.com/vim/vim
Также, можно было скачать архив на сайте, и затем распаковать его в нужную папку, но так будет удобнее. Утилита создаст папку с именем программы, нам нужно сделать ее рабочей:
Настройка configure
Дальше нам нужно запустить скрипт, который проверит нашу программу на совместимость с системой и настроит параметры компиляции. Он называется configure и поставляется разработчиками программы вместе с исходниками. Весь процесс компиляции описан в файле Makefile, его будет создавать эта утилита.
Если configure нет в папке с исходниками, вы можете попытаться выполнить такие скрипты чтобы его создать:
Также для создания этого скрипта можно воспользоваться утилитой automake:
aclocal
autoheader
automake —gnu —add-missing —copy —foreign
autoconf -f -Wall
Утилита automake и другие из ее набора генерируют необходимые файлы на основе файла Mackefile.am. Этот файл обязательно есть в большинстве проектов.
После того как вы получили configure мы можем переходить к настройке. Одним из огромных плюсов ручной сборки программ есть то, что вы можете сами выбрать с какими опциями собирать программу, где она будет размещена и какие дополнительные возможности стоит включить. Все это настраивается с помощью configure. Полный набор опций можно посмотреть, выполнив:
Рассмотрим наиболее часто используемые, стандартные для всех программ опции:
- —prefix=PREFIX — папка для установки программы, вместо /, например, может быть /usr/local/, тогда все файлы будут распространены не по основной файловой системе, а в /usr/local;
- —bindir=DIR — папка для размещения исполняемых файлов, должна находится в PREFIX;
- —libdir=DIR — папка для размещения и поиска библиотек по умолчанию, тоже в PREFIX;
- —includedir=DIR — папка для размещения man страниц;
- —disable-возможность — отключить указанную возможность;
- —enable-возможность — включить возможность;
- —with-библиотека — подобно enable активирует указанную библиотеку или заголовочный файл;
- —without-библиотека — подобное disable отключает использование библиотеки.
Вы можете выполнить configure без опций, чтобы использовать значения по умолчанию, но также можете вручную указать нужные пути. В нашем случае ./configure есть, и мы можем его использовать:
Во время настройки утилита будет проверять, есть ли все необходимые библиотеки в системе, и если нет, вам придется их установить или отключить эту функцию, если это возможно. Например, может возникнуть такая ошибка: no terminal library found checking for tgetent(). configure: error: NOT FOUND!
В таком случае нам необходимо установить требуемую библиотеку. Например, программа предлагает ncurses, поэтому ставим:
sudo apt install libncurces-dev
Приставка lib всегда добавляется перед библиотеками, а -dev — означает, что нам нужна библиотека со всеми заголовочными файлами. После удовлетворения всех зависимостей настройка пройдет успешно.
Сборка программы
Когда настройка будет завершена и Makefile будет готов, вы сможете перейти непосредственно к сборке программы. На этом этапе выполняется непосредственно преобразование исходного кода в машинный. Утилита make на основе Makefile сделает все необходимые действия:
Дальше осталось установить саму программу, если вы использовали опцию prefix, чтобы не устанавливать программу в основную файловую систему, то можно применить стандартную опцию make:
После этого программа будет установлена в указанную вами папку, и вы сможете ее использовать. Но более правильный путь — создавать пакет для установки программы, это делается с помощью утилиты checkinstall, она позволяет создавать как deb, так и rpm пакеты, поэтому может использоваться не только в Ubuntu. Вместо make install выполните:
Затем просто установите получившийся пакет с помощью dpkg:
sudo dpkg install vim.deb
После этого сборка программы полностью завершена и установлена, так что вы можете переходить к полноценному использованию.
Если вы устанавливали программу с помощью make install, то удалить ее можно выполнив в той же папке обратную команду:
sudo make uninstall
Команда удалит все файлы, которые были скопированы в файловую систему.
Выводы
В этой статье мы рассмотрели, как выполняется компиляция программы Linux. Этот процесс может быть сложным для новичков, но в целом, все возможно, если потратить на решение задачи несколько часов. Если у вас остались вопросы, спрашивайте в комментариях!
На завершение видео о том, что такое компилятор и интерпретатор:
Источник
How to compile and generate .exe?
My task: I have to compile some c/c++ project so that I will get an .exe file, also for the c/c++ files the script will generate some «object files».
From what I read I understood that i’ll have to use the gcc bash compiler. I’ve looked for gcc references without succes online. I have some code lines:
Is this any good? What exactly the «-c» and «-o» parameters do? Does anyone have any links for this or tutorials or so, please?
1 Answer 1
Linux has no particular strictness over file extensions therefore binary files don’t normally end in .exe To create binaries from a C/C++ source file. You need a compiler such as GCC for .c and g++ for .cpp. These can be obtained from your Linux distro repository manager e.g in opensuse
To compile a c source file named myfile.c to create a binary called myfile.
For a c++ source file.
For several C source files you can create appropriate header files and use ar command to create a static or shared library then link them e.g to create a static library from 2 c source files.
The -c flag creates .o (object file) containing hexadecimal routines that are archived and indexed by the ar command into a static library called libmyfiles.a . shared libraries end in .so and need to be prduced with position-independent code (-lfpic).
However to link to an existing shared library e.g the pthread when you have used threading header file pthread.h you can link to the library as follows.
To run the main program at the command line
Where mainprog can be the name of the output binary file. You can also look into makefiles that ease the amount of work needed to compile large projects. There are also manual pages containing information about compiler flags
or if you use KDE . you can insert this at the konqueror browser address bar for well formatted output.
Источник
Сборка .exe из под Linux
Доброго времени суток товарищи кодеры, а кодерам линуксоидам вдвойне!
Меня интересует седующий вопрос:
Каким способом наиболее эффективно собрать код в exe-шник?
Имеется в виду не просто сборка с заданным разширением, но и работоспособность в осях Win. Как консольные, так и проги с собственным интерфейсом.
Как это делаете вы? Если делаете.
Использовать виртуальную машину или поставить Win не имею возможности.
Что если через установить например VS или Delphi, запускать это wine’ом, писать на них с использованием библиотек WinAPI и как результат собирать, то будет ли полученный файл юзабелен под Windows?
Если вы посоветуете кроссплатформенный компилятор, то накидайте небольшое HowTo или линк на него пожалуйста.
5 ответов 5
Что если через установить например VS или Delphi, запускать это wine’ом, писать на них с использованием библиотек WinAPI и как результат собирать, то будет ли полученный файл юзабелен под Windows?
Да, это возможно. Получаемый исполняемый файл будет такой же как при сборке под Windows. Единственный нюанс связан с тем, что VS и Delphi являются серьезными программными комплексами и их произвольная версия с произвольной версией wine и linux может быть просто неработоспособна. Но с достаточно старыми и ‘зрелыми’ версиями студий проблем не будет.
Каким способом наиболее эффективно собрать код в exe-шник?
Компилятором, поддерживающим кросс-компиляцию. Это означает, что компилятор будет под linux, а выходной код — под windows. Ищите в гугле по ключевым словам gcc, cross-compile, windows. Еще рекомендую обратить внимание на проекты Mingw32 и Cygwin: они позволяют писать программы под windows с помощью gcc, т.е. можно делать переносимые программы между средами linux и windows с одним исходным кодом, путем простой перекомпиляции.
Источник
Создать exe-файл в Linux с использованием cmake
Необходимо под Linux системой (Ubuntu 17) собрать проект с использованием cmake.
Как можно это реализовать, и если это недопустимо, то как это добиться успеха используя какой-нибудь кросс-компилятор (например, mingw), если нужно при этом подключить библиотеки. С использованием mingw возникли проблемы, при запуске полупустого проекта возникает ошибка «Отсутствие библиотеки libstdc++6. «
1 ответ 1
Если Ваш проект чисто собирается под линуксом и у Вас установлен mingw32 или mingw64, сделайте следующее:
1) создайте отдельный каталог для сборки проекта под виндовсы в каталоге, где- лежит Ваш CMakeLists.txt и зайдите в него
2) запустите генератор, который создаст Makefie-иерархию для кросс-компилятора mingw
(Путь к тулчейну отредактируйте как нужно в Вашей системе)
3) запустите сборку
4) если все прошло как надо, проверьте работу под wine
5) если под wine работает, соберите под виндовсы пакет с необходимым рантаймом — для запуска под живыми виндовсами кроме самой программы нужно взять .dll-и, что лежат в /usr/x86_64-w64-mingw32/sys-root/mingw/bin или /usr/i686-w64-mingw32/sys-root/mingw/bin (Это у меня в федоре они там, где у Вас, не знаю — посмотрите сами)
Выберите из них те, на отсутствие которых ругается загрузчик при запуске вашей программы под виндовсами, и положите рядом с исполняемым файлом.
Для сборки, используя MSVC, нужно собирать под виндовсами. Процесс выглядит так:
1) Открываем cmd-среду из установленных в меню Программы при установке MSVCxx
2) переходим в каталог сборки (предполагаем, что он в создан каталоге, где лежит Ваш CMakeLists.txt)
3) запускаем cmake
или указывая генератор явно, если рабочая платформа не целевая (кросскомпиляция)
Источник