我正在尝试按如下方式组织我的项目目录
壳
| 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.
有人能在这里找到我做错的事吗?几天来我一直在努力。
答案 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 $@ $<