2012-03-16 5 views
0

Я хотел написать Makefile для программы, которая имеет исходные файлы, расположенные в разных каталогах, структура:Makefile с несколькими каталогами

--root(here will be makefile)  
    --src: 
    --main.c 
    --include: 
     --here are 6 .h files, that are used by other .c files, main.c includes on all of them 
    --operacje 
     --suma.c 
     --iloczyn.c 
     --roznica.c 
    --reszta: 
     macierz.c 
    --we_wy: 
     --rest of the .c files 

большинство .c файлов включают в себя по крайней мере один файл .h. Это то, что я написал до сих пор:

VPATH=./src:./src/include:./src/operacje:./src/reszta:./src/we_wy 
CLFAGS = -Wall 
CC = gcc 
INCLUDE = -I src/include 
NAME = macierze 

FILE_SOURCE := pliki.c wczytaj_plik.c wypisz_plik.c 
CONSOLE_SOURCE := wczytaj_konsola.c wypisz_konsola.c 
OTHER_SOURCE := suma.c roznica.c iloczyn.c macierz.c 
HEADERS := suma.h roznica.h iloczyn.h wypisz.h wczytaj.h macierz.h 

FILE_OBJECTS := $(FILE_SOURCE:.c=.o) 
CONSOLE_OBJECTS := $(CONSOLE_SOURCE:.c=.o) 
OTHER_OBJECTS := $(OTHER_SOURCE:.c=.h) 

%.o: %.c %.h 
    gcc $(CFLAGS) $(INCLUDE) -c $? 

%.o: %.c 
    gcc $(CFLAGS) $(INCLUDE) -c $? -o [email protected] 


finput: HEADERS+=pliki.h 

finput: $(FILE_OBJECTS) $(OTHER_OBJECTS) main.o 
    gcc $(CFLAGS) -o $(NAME) $^ -D WEWY_PLIKI 

main.o: main.c $(HEADERS) 
    gcc $(CFLAGS) $(INCLUDE) -c src/main.c 

clean: 
    rm -rf *.o 

Цель состоит в том, чтобы сделать скомпилированная программа работать немного по разному в зависимости от марки, поэтому опция -D и добавление

finput: HEADERS+=pliki.h 

это finput является первым из 4 возможных вариантов. Каждый вариант будет использовать несколько иной набор .c и .h файлов

Теперь, когда я

make finput 

я получить распечатку:

gcc -I src/include -c ./src/we_wy/pliki.c ./src/include/pliki.h 
gcc -I src/include -c ./src/we_wy/wczytaj_plik.c -o wczytaj_plik.o 
gcc -I src/include -c ./src/we_wy/wypisz_plik.c -o wypisz_plik.o 
gcc -I src/include -c src/main.c 
gcc -o macierze pliki.o wczytaj_plik.o wypisz_plik.o ./src/include/suma.h ./src/include/roznica.h ./src/include/iloczyn.h ./src/include/macierz.h main.o -D WEWY_PLIKI 
wczytaj_plik.o: In function `wczytaj': 
wczytaj_plik.c:(.text+0x5f): undefined reference to `macierz_alokuj' 
main.o: In function `main': 
main.c:(.text+0x7e): undefined reference to `suma' 
<and other undefined references in main> 

я заметил несколько ошибок: 1 он не производит файлы .o из $ (OTHER_OBJECTS) 2. нет опции -Wall от $ (CFLAGS) 3. и, конечно, он не завершен.

Я был бы признателен за информацию, что я делаю неправильно.

ответ

1

OTHER_OBJECTS: = $ (OTHER_SOURCE: .c = .h)

Если это не опечатка, это объяснение (1.). Вы переименовываете файлы в файлы заголовков, а файлы заголовков находятся в VPATH и не имеют правил переделки, поэтому они включаются дословно в $ ^. Попробуйте $(OTHER_SOURCE:.c=.o).

CLFAGS = -Wall

Попробуйте CFLAGS вместо этого.

+0

Теперь я чувствую себя глупо, все работает нормально, это всего лишь 2 опечатки ..., в любом случае большое спасибо за помощь. – Andna

+0

У меня есть еще один вопрос, я исправил make-файл, но каждый раз, когда я вызываю make finput, он всегда, по крайней мере, связывает файлы .o (правило finput), даже если я не внес никаких изменений в файлы, почему? – Andna

+0

Нет файла 'finput', только файл' macierze'. Целевая часть говорит 'finput', хотя, поэтому make ищет' finput' и не находит его. Замените 'finput' на' $ (NAME) 'везде. – thiton

1

Просто, чтобы указать, что это:

finput: HEADERS+=pliki.h 
    ... 
main.o: main.c $(HEADERS) 

не будет делать то, что вы хотите, чтобы это сделать. Только целевые переменные действуют внутри рецептов дочерних целей. Они не влияют на список предварительных условий (например).

Я настоятельно рекомендую вам изучить методы автоматического создания зависимостей make: это намного эффективнее (и точнее), чем пытаться поддерживать их вручную в make-файле.