Как скомпилировать файл в linux
Перейти к содержимому

Как скомпилировать файл в linux

  • автор:

GCC C command-line compilation

This text describes C code compilation with GCC on Linux from the command-line using shell scripts. The intention is to simplify building own’s own code.

Install the development tools gcc and binutils to get the compiler, linker, headers, libraries and binary utilties (i.e. ar , objdump , nm , strip etc.). For C++ compilation, install and use g++ .

Throughout the text, source files are assumed to be located as shown in figure 1. Within the project directory: the build script build.sh is at the root, code files (i.e. .c/.cpp/.h/.hpp) are in src/ , third party libraries are in lib/ , third party library headers are in lib/inc/ , and finally binaries are output to obj/ .

Figure 1: Directory structure for building binary executables or libraries. On the left is an example for building an executable named main . Third-party libraries are put in the lib folder within the directory structure.

Building an executable

Below is the script build.sh that builds an executable. The working directory is first changed to the root of the project directory. The directory obj/ is created if it doesn’t exist.

For debug builds set the options below instead and don’t strip the binary.

Optimize for size with the compiler options -Os -fdata-sections -ffunction-sections and the linker option —gc-sections .

Linker options are passed with -Wl,<comma-separated options> . Linker option -rpath-link adds a secondary library dependency search path when building. For example, for locating libsomelibrary.so ‘s dependencies. The option can be passed multiple times.

The option -rpath adds a library search path and encodes it into the binary. The literal text value ‘$ORIGIN’ is the location of the executable itself; ‘$ORIGIN/lib’ is also possible. The option -z origin tells the linker that the object uses ‘$ORIGIN’ .

The option -rpath will either result in an RPATH entry or an RUNPATH entry in the binary. Use linker option —disable-new-dtags to ensure RPATH is used and —enable-new-dtags to ensure RUNPATH is used. The difference is that RPATH takes precedence over LD_LIBRARY_PATH and also that RUNPATH is not used to find secondary library dependencies.

Building a shared library

Below is the script build.sh that builds a shared library. Symbolic links are created for both the library name and its soname, so that the library file can be updated with ABI-compatible changes without affecting dependent binaries.

—no-undefined (alternatively, -z defs ) and —no-allow-shlib-undefined fails the build if there are unresolved symbols from either the compiled sources or the dependencies. A library built with missing symbols will cause linker errors for executables using it.

As mentioned for building executables, the option -rpath-link adds library search paths when building and doesn’t affect the run-time library search paths (unlike -rpath ).

When both a library and its dependant executable use -Wl,-rpath,’$ORIGIN’ the library’s file location is searched before the executable’s when locating the library’s dependencies.

-fPIC compiles code as position-independent for use with -shared . -fPIC is used both during compilation and linking in case supplementary code is built or to avoid linking against the wrong support libraries. Building a shared library that links to a static library requires that the static library was also compiled with -fPIC .

Building a static library

Below is the script build.sh that builds a static library.

To force the linker to choose a static library instead of a shared one when both are available, use one the following methods.

  • Specify libsomelibrary.a with full path as an object (and not with -l ).
  • Use: -l:libsomelibrary.a .
  • Use: -Wl,-Bstatic -lsomelibrary -Wl,-Bdynamic .

Example code

Below are example source code files main.c, somelibrary.h, and somelibrary.c.

The extern «C» block makes C++ compilers use the non-name-mangled C type symbols.

Binary utilities

Use the binary utilities from binutils as below to make sure the binaries are built as expected. The strip utility used in the build scripts removes unneeded symbols.

LibreBay

Статьи про ОС Ubuntu. Языки программирования Си и C++.
Инструменты разработки и многое другое.

понедельник, 5 декабря 2016 г.

Как скомпилировать программу на C/C++ в Ubuntu

ubuntu terminal

Помню, когда я только начинал программировать, у меня возник вопрос: «Как скомпилировать программу на C в Ubuntu?» Для новичков это не легкая задача, как может показаться на первый взгляд.

Мой путь изучения C начался с бестселлера «Брайан Керниган, Деннис Ритчи, Язык программирования C, 2-е издание». Там рассказывается как скомпилировать программу в операционной системе Unix, но этот способ не работает в Linux. Авторы книги выкрутились, написав следующее:

Текстовый редактор gedit

Для написания первых программ подойдет обычный, используемый по умолчанию в Ubuntu, текстовый редактор с подсветкой синтаксиса — gedit.

Запуск текстового редактора
Рис. 1. Запуск текстового редактора.

Первой программой по традиции является «Hello, World!», выводящее приветствие на экран:

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

Программа hello, World!
Рис. 2. Программа hello, World.

Компиляция программы на C

Теперь запускаем терминал, можно через Dash, а можно с помощью горячих клавиш <ctrl> + <Alt> + <T> . Здесь в начале установим инструменты сборки, куда входят необходимые компиляторы gcc для языка C и g++ для языка C++:

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

Далее в терминале нам необходимо перейти в директорию, куда сохранили файл с текстом программы. Перемещение выполняется командой cd (англ. change directory — изменить каталог). Чтобы воспользоваться командой в начале пишется cd , затем через пробел путь , куда нужно перейти.

Для перехода на рабочий стол, команда будет следующей:

Обратите внимание на символ обратной косой черты \ в имени директории Рабочий стол . Обратная косая экранирует пробел, и сообщает команде cd , что пробел и следующие за ним символы являются частью имени. Символ

в начале пути обозначает путь до домашней папки пользователя.

Для просмотра содержимого директории применяется команда ls (сокращение от англ. list).

Работа в терминале
Рис. 3. Работа в терминале.

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

  • gcc — компилятор для языка программирования C;
  • -Wall — ключ вывода всех предупреждений компилятора;
  • -o hello — с помощью ключа -o указывается имя выходного файла;
  • hello.c — имя нашего исходного файла, который компилируем.

В завершение запустим hello , вводом имени программы с префиксом ./ :

Префикс ./ сообщает терминалу о необходимости выполнить программу с заданным именем в текущем каталоге. (Точка — это условное название текущего каталога.)

Работа в терминале, продолжение
Рис. 4. Работа в терминале, продолжение.

Компиляция программы на С++

Программы на C++ компилируются аналогично, как и программы на C. «Hello, World!» на C++ можно написать так:

Сохраняем текст программы в файл под именем hello2.cpp . Таким образом, команда компилирования будет иметь вид:

Для запуска результата вводим в терминале:

Заключение

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

Как скомпилировать файл asm и выполнить его на Linux?

Как теперь выполнить программу в терминале? (Запустить outfile)?

insolor's user avatar

Konstantin_SH's user avatar

По умолчанию nasm (обычно) компилирует в bin -формат, что равносильно обычному плоскому коду. Вообще говоря, такие файлы не являются исполняемыми практически ни для какой ОС. Но если файл сформирован специальным образом, в начале asm -файла пропущен блок в 256 байт т.е. в начало добавлено:

То этот файл будет эквивалентен COM -формату DOS. Его можно запустить в эмуляторе DOS’а, например dosbox .

Чтобы скомпилировать исполняемый файл для linux нужно явно указать формат:

Но для этого код должен быть написан непосредственно для linux (использовать его системные вызовы и т.п.).

Как скомпилировать файл в linux

Команда gcc предназначена для компиляции с помощью компилятора GCC кода на языке C. Данная команда похожа на команду g++, используемую для компиляции кода на языке C++.

Базовый синтаксис команды выглядит следующим образом:

$ gcc [параметры] имена файлов

В качестве имен файлов могут использоваться как имена файлов исходного кода на языке C с расширением .c, так и имена файлов объектного кода с расширением .o. Компилятор поддерживает поистине огромное количество параметров, но наиболее важными из них являются такие параметры, как параметр -o, позволяющий задать имя результирующего исполняемого файла, параметр -c, позволяющий лишь скомпилировать файл без связывания (то есть, создать файл объектного кода, а не исполняемый файл), параметр -O, позволяющий задать уровень оптимизации и параметр -l, позволяющий указать библиотеку, которая должна быть связана с результирующим исполняемым файлом.

Примеры использования

Компиляция программы из одного файла исходного кода

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

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

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