Makefile子目录

时间:2011-11-06 21:50:05

标签: c makefile subdirectory

我正在尝试按如下方式组织我的项目目录


| inc / [header files]
| obj / [目标文件]
| src / [源文件]
| Makefile文件
|可执行

所有内容都在根文件夹中编译而没有错误,但是我很难修改我的makefile以适应不同目录中的所有内容。

以下是我的makefile在没有目录的情况下的外观

OBJS = shutil.o parser.o sshell.o
HEADER_FILES = shell.h parser.h
EXECUTABLE = sshell
CFLAGS = -Wall
CC = gcc
#Create main executable
$(EXECUTABLE): $(OBJS)
    $(CC) -o $(EXECUTABLE) $(OBJS)
#Create object files
%.o: %.c
$(CC) $(CFLAGS) -I.  -c -o $@ $<
$(OBJS) : $(HEADER_FILES)

我已经尝试将目录添加到定义中(对于obj /和inc /目录)

OBJS = obj/shutil.o obj/parser.o obj/sshell.o

并将%.o和%.c的每个实例修改为obj /%。o和src /%。c

据我所知,一切都应该没问题,但是当我从根目录开始制作时我会收到此错误

gcc -Wall -Iinc -c -o obj/shutil.o src/shutil.c
src/shutil.c:8:23: fatal error: inc/shell.h: No such file or directory
compilation terminated.

有人能在这里找到我做错的事吗?几天来我一直在努力。

3 个答案:

答案 0 :(得分:1)

-I.更改为-I${CURDIR}。前者将正在编译的源的目录添加到包含路径列表,该列表将为shell/src。后者添加shell,这可能是你想要的。

您还可以查看Building multiple executables with similar rules的微型非递归制作框架。

答案 1 :(得分:0)

您的编译器正在寻找inc / shell.h,它不应该。通常,源文件中不应包含与构建系统相关的路径,但构建系统的细节应该通过编译器标志来定义。

也就是说,您的源文件src / shutil.c应如下所示:

#include "shell.h"

并且您的编译器调用是相同的,-Iinc传递包含路径。

通过保留源文件的路径,头文件的实现和安装更加简单。

答案 2 :(得分:0)

好吧,它花了一些彻底的挫败感,但我现在明白了。 我在顶部更改了我的定义以包含文件路径,如下所示:

OBJS = obj/shutil.o obj/parser.o obj/sshell.o
HEADER_FILES = inc/shell.h inc/parser.h

似乎关键是-I./inc,而不是像我预期的那样--Iinc。

obj/%.o: src/%.c
    $(CC) $(CFLAGS) -I./inc -c -o $@ $<