Makefile с несколькими каталогами - PullRequest
0 голосов
/ 16 марта 2012

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

--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 $@


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

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

finput: HEADERS+=pliki.h

thisfinput - первый из 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>

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

Iбыл бы признателен за некоторую информацию, что я делаю не так.

Ответы [ 2 ]

1 голос
/ 16 марта 2012

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

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

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

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

1 голос
/ 16 марта 2012

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

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

CLFAGS = -Wall

Попробуйте CFLAGS.

...