我想为源文件位于不同目录的程序编写一个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 $@
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
这个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.它不会从$(OTHER_OBJECTS)生成.o文件 2. $(CFLAGS)没有-Wall选项 3.当然,它还没有完成。
我会感激一些信息,我做错了什么。
答案 0 :(得分:1)
OTHER_OBJECTS:= $(OTHER_SOURCE:.c = .h)
如果这不是拼写错误,则是(1.)的解释。您将文件重命名为头文件,并且头文件在VPATH中找到并且没有重制规则,因此它们在$ ^中逐字包含。试试$(OTHER_SOURCE:.c=.o)
。
CLFAGS = -Wall
请尝试CFLAGS
。
答案 1 :(得分:1)
只是指出这一点:
finput: HEADERS+=pliki.h
...
main.o: main.c $(HEADERS)
不会做你想做的事。特定于目标的变量仅在子目标的配方中生效。它们对先决条件列表没有任何影响(例如)。
我建议您研究自动生成make依赖项的方法:这比在makefile中手动维护它们更有效(也更准确)。