Библиотека сайта rus-linux.net
Цилюрик О.И. Linux-инструменты для Windows-программистов | ||
Назад | Компиляция и сборка приложений | Вперед |
Компилятор GCC
Программа:
#include <stdio.h> int main( int argc, char *argv[] ) { printf("Hello, world!\n" ); };
Примечание: единственно понадобившийся мне
#include
здесь : <stdio.h>
, без него:
$ gcc hello_world.c hello_world.c: In function ‘main’: hello_world.c:4: предупреждение: incompatible implicit declaration of built-in function ‘printf’
Вот как мы делаем компиляцию-сборку такой простейшей программы:
$ gcc hello_world.c $ ls -l -rwxrwxr-x 1 olej olej 4735 Мар 19 15:44 a.out -rw-rw-rw- 1 olej olej 94 Мар 19 15:48 hello_world.c $ file a.out a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped $ g++ hello_world.c $ ls -l -rwxrwxr-x 1 olej olej 5180 Мар 19 15:49 a.out -rw-rw-rw- 1 olej olej 94 Мар 19 15:48 hello_world.c
У GCC великое множество опций (знаменитая книга Артура Гриффитса «GCC: Complete Reference» имеет 624 стр.), ниже перечислены только ежедневно используемые...
Компилятор распознаёт язык программирования
исходного кода, применённый в файле, по расширению файла, например:
*.c
— C, *.cc
— C++, *.S
—
ассемблер в AT&T нотации (не Intel!). Но язык кода можно
определить и ключом -x <язык>
. В одной команде GCC в качестве
входных файлов могут смешиваться файлы разных форматных представлений
(исходные С, исходные ассемблерные, объектные):
$ gcc f1.c f2.S f3.o —o resfile
GCC может произвести только частичную обработку, произведя результат в зависимости от ключа:
-c
—
только компилировать в объектный формат (не вызывать компоновщик):
$ gcc fin.c -c —o fout.o
-S
— компилировать в ассемблерный код:
$ gcc fin.c -S —o fout.S
-E
— только выполнить препроцессорную обработку и разрешить макросы:
$ gcc fin.c -E —o fout.c
Справочная информация по GCC:
$ gcc --version gcc (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42) $ gcc --help Синтаксис: gcc [ключи] файл... ... $ man gcc GCC(1) GNU GCC(1) NAME gcc - GNU project C and C++ compiler ...
- текст man
очень объёмный и может в меру долго загружаться.
Запуск и исполнение приложений:
$ gcc hello_world.c -o hello_world $ ./hello_world Hello, world! $ hello_world bash: hello_world: команда не найдена $ strace ./hello_world execve("./hello_world", ["./hello_world"], [/* 54 vars */]) = 0 brk(0) = 0x9b8a000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 4 fstat64(4, {st_mode=S_IFREG|0644, st_size=114110, ...}) = 0 mmap2(NULL, 114110, PROT_READ, MAP_PRIVATE, 4, 0) = 0xb7fa5000 close(4) = 0 open("/lib/libc.so.6", O_RDONLY) = 4 read(4, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000\277\266\0004\0\0\0"..., 512) = 512 ... write(1, "Hello, world!\n", 14Hello, world!) = 14 exit_group(14) = ? $ ltrace ./hello_world __libc_start_main(0x8048384, 1, 0xbf8e7724, 0x80483c0, 0x80483b0 <unfinished ...> puts("Hello, world!"Hello, world! ) = 14 +++ exited (status 14) +++
Предыдущий раздел: | Оглавление | Следующий раздел: |
Компиляция и сборка приложений | Библиотеки |