Библиотека сайта 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) +++
| Предыдущий раздел: | Оглавление | Следующий раздел: |
| Компиляция и сборка приложений | Библиотеки |
