Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > GNU toolchain > как пользоваться makefile


Автор: f999t1 17.4.2006, 10:27
как пользоваться makefile для компановки нескольких файлов 

Автор: comcon1 17.4.2006, 11:58
Синтаксиз таков:

Маке-файл состоит из целей, которые обозначаются так.
Код

<имя цели>:  <файлы или подцели, изменение которых ведет к пересборке цели>
<табуляция!> <команда для сборки>\
 <продолжение команды для сборки>


Простой пример:
Код

# по умолчанию выполняется цель 'all'
# в данном случае для пересборки цели необходима сборка подцелей 
# object1.o и object2.o
all: object1.o object2.o
          g++ -o result object1.o object2.o

# вот описание подцелей
# эта подцель будет пересобрана при изменении хотябы одного из 
# файлов object1.cpp или object1.hpp
object1.o: object1.cpp object1.hpp
         g++ -c object1.cpp

object2: object2.cpp object2.hpp
         g++ -c object2.cpp



Вот более сложный пример.
Код

# Project: rotator_dev
# Makefile created by Dev-C++ 4.9.9.2
# and adopted to *NIX by comcon1


#
# CHECK IF YOUR BOOST LIBRARIES SUITE
# -----------------------------------
# внешнии библиотеки
LIBS =  -lboost_program_options-gcc -lboost_regex-gcc
# -----------------------------------
# DO NOT MODIFY THE REST BLOCK! 
#  

# команда компилятора
CPP  = g++
# список объектных файлов
OBJ  = objects/rotator.o objects/config_inp.o objects/global_bits.o objects/pdbi.o objects/rotate_bits.o objects/penergy.o $(RES)
# опции компилятора
CXXINCS = -Iinclude
# название выходного exe-файла
BIN  = bin/rotator
CXXFLAGS = $(CXXINCS) -O2 -Wall -Dwin32
# команда стирания
RM = rm -f
# команда линкера
LD = g++
# опции линкера
LDFLAGS = $(LDFLAGS)

all:  $(BIN)

clean: clean-custom
    ${RM} $(OBJ) $(BIN)

$(BIN): $(OBJ)
    $(LD) $(OBJ) -o $(BIN) $(LIBS) $(LDFLAGS)

objects/rotator.o: rotator.cpp
    $(CPP) -c rotator.cpp -o objects/rotator.o $(CXXFLAGS)

objects/config_inp.o: config_inp.cpp
    $(CPP) -c config_inp.cpp -o objects/config_inp.o $(CXXFLAGS)

objects/global_bits.o: global_bits.cpp
    $(CPP) -c global_bits.cpp -o objects/global_bits.o $(CXXFLAGS)

objects/pdbi.o: pdbi.cpp
    $(CPP) -c pdbi.cpp -o objects/pdbi.o $(CXXFLAGS)

objects/rotate_bits.o: rotate_bits.cpp
    $(CPP) -c rotate_bits.cpp -o objects/rotate_bits.o $(CXXFLAGS)

objects/penergy.o: penergy.cpp
    $(CPP) -c penergy.cpp -o objects/penergy.o $(CXXFLAGS)

   

Автор: f999t1 18.4.2006, 13:31
твой пример надо писать в отдельно файле (какое должно быть расширение)

и что если один файл на C другой на asembler  

Автор: comcon1 19.4.2006, 15:36
Создаешь это в файле, называемом Makefile.
Тогда команда:
Код

 make

Будет лезть в него. Если он назван по другому, то запуск сборки, к примеру:
Код

 make -f Makefile.win


А сборка с асм:
Код

# по умолчанию выполняется цель 'all'
# в данном случае для пересборки цели необходима сборка подцелей 
# object1.o и object2.o
all: object1.o object2.o
          g++ -o result object1.o object2.o

# вот описание подцелей
# эта подцель будет пересобрана при изменении хотябы одного из 
# файлов object1.cpp или object1.hpp
object1.o: object1.cpp object1.hpp
         g++ -c object1.cpp

# не знаю, какой там синтаксиз :(, не компилил в POSIX ассемблере
# ну например:
object2: object2.asm
         tasm object2.asm


 

Автор: f999t1 19.4.2006, 16:43
В принципе разобрался. 
у меня получился работающий makfile


Код

all.out: main.o f13.o f23.o
    gcc -o all.out main.o f13.o f23.o
main.o: main.c f13.h f23.h
    gcc -o main.o -c main.c 
f13.o: f13.c f13.h
    gcc -o f13.o -c f13.c
f23.o: f23.c f23.h
    gcc -o f23.o -c f23.c





но как еге переделать с использованием переменных
типа OBJ=main.o f13.o f23.o
и  $, @ и т.п (не пойму как ими пользоваться)  

Автор: comcon1 19.4.2006, 23:32
Наверно, правильнее всего так:

Код

OBJ = main.o f13.o f23.o
BIN = all.out

all: $(BIN)

$(BIN): $(OBJ)
    gcc -o $(BIN) $(OBJ)

clean:
    rm -f $(BIN) $(OBJ)



main.o: main.c f13.h f23.h
    gcc -o main.o -c main.c 
f13.o: f13.c f13.h
    gcc -o f13.o -c f13.c
f23.o: f23.c f23.h
    gcc -o f23.o -c f23.c

 

Автор: jonie 19.4.2006, 23:58
какие "автосоздатели" make файлов вы предпочитаете ? А-то самому ручками писать уж больно долго.....
желательно создание как под win так и под nix компиляторы....   

Автор: comcon1 20.4.2006, 12:16
see autobook. (aclocal, autoconf, automake, libtool)
win: Dev-Cpp, minGw development studio 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)