четверг, 6 января 2011 г.

Команда make и Makefile

Команда make.

Предположим нам нужно сделать исполняемый файл programma из исходниых файлов main.cpp function.cpp и заголовочного function.h. Создадим файл makefile в той же директории где находяться выше перечисленные файлы.

vitaliy@fox:~/$ nano makefile
programma : main.o function.o
                    g++ -o programma main.o function.o

main.o : main.cpp function.h
             g++ -c main.cpp

function.o : function.cpp function.h
                g++ -c function.cpp

clean : 
           rm programma main.o function.o

makefile состоит из четырех частей каждая из честей строиться по следующему принципу:

цель : предпосылка
          команда

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

Теперь для создания исполняемого файла выполним команду make:
vitaliy@fox:~/$  make
g++ -c main.cpp
g++ -c function.cpp
g++ -o programma main.o function.o

Для удаления данных выполнить make clean:
vitaliy@fox:~/$  make clean
rm programma main.o function.o

!!! Очень полезная функция программы make, заключаеться в том что она может обнавлять файлы. В случае если один из файлов-предпосылок был изменен программа make выполнинт команду для всех целей где указан этот файл-предпосылка. К примеру вы изменили что-то в исходном файле function.cpp, теперь еслы вы выполните повторно команду make она проверит время редактирования всех файлов-предпосылок и сравнит со значениями в своей базе с момента последнего выполнения команды make. В тех случаях где файйл-предпосылка изменен  make повторно выполнит соответствущие команды. В нашем случае make выполнит команду 
g++ -c function.cp
Если бы был изменен файл function.h ,были бы выполнины команды во  всех секциях где есть этот файл, а именно:
g++ -c main.cpp
g++ -c function.cpp



Можно также расширить возможность установки добавив цели install и uninstall :
vitaliy@fox:~/$ nano makefile
programma : main.o function.o
          g++ -o programma main.o function.o

main.o : main.cpp function.h
          g++ -c main.cpp

function.o : function.cpp function.h
          g++ -c function.cpp

clean : 
          rm programma main.o function.o

install : 
         cp programma /usr/sbin/programma

uninstall : 
         rm -f /usr/sbin/programma 

Теперь после того как Вы выполнили команду make,  выполните из под рута команду make install для установки(копирования) исполняемого файла в директорию  /usr/sbin/
root@fox:/home/vitaliy# make install


Для удаления исполняемого файла из дериктории /usr/sbin/ 
root@fox:/home/vitaliy# make uninstall

Компиляция и линковка c g++

Для того что бы создать исполняемый файл необходимо выполнить ряд действий:
1. Скомпелировать исходные в файлы в (промежуточный) объектный тип расширением .o
2. Из обьектных файлов путем их компановки между собой и со стандартной библиотакой C++ получить исполняемый файл.



1. На первом шаге исходные файлы с раширением .cpp (такие как основной файл main.cpp, файлы элемент-функций классов function.cpp), при помощи заголовочных  файлов классов таких как  function.h (расширение .o) компилируються в обьектные (промежуточные) файлы.



ключ -c (компилирование) - создание обьектоного файла;
ключ -o (линковка) - создание исполняемого файла.



vitaliy@fox:~/$ g++ -Wall -c "main.cpp"
vitaliy@fox:~/$ g++ -Wall -c "function.cpp"
vitaliy@fox:~/$ ls -l

итого 48
-rw-r--r-- 1 vitaliy vitaliy  829 Янв  6 23:06    main.o
-rw-r--r-- 1 vitaliy vitaliy 3824 Янв  6 23:14   function.o
...


2. На втором этапе компановщик компанует(линкует) обьектные файлы между собой, а также со стандартной библиотекой C++. (Все файлы находяться в одной папке).
Следующая команда с ключом -o создаст исполняемый файл programma:


vitaliy@fox:~/$ g++ -Wall  main.o function.o -o programma 

vitaliy@fox:~/$ ls -l
итого 48
-rwxr-xr-x 1 vitaliy vitaliy 9753 Янв  6 23:32 programma
...

Выше  компановщик g++ линкует  файлы  main.o object.o между собой, и с бибилотекой C++.


__________________________________________________________________________________

Также возможно сразу создать исполняемую программу programma, непосредственно из исходных файлов .cpp. В этом случае обязательно нужно что бы заголовочные файлы классов .h
находились в одной папке с исходными файлами.

vitaliy@fox:~/$ g++ -Wall main.cpp object.cpp -o programma

vitaliy@fox:~/$ ls -l
итого 48
-rwxr-xr-x 1 vitaliy vitaliy 9753 Янв  6 23:32 programma
...
Выше утилита g++ одной командой создает обьектные файлы, и сразу же из них исполняемый файл, всё в одной строке.



-Wextra //ключ  с дополнительной информацией о предупреждениях