C语言 创建文件子目录



我试图组织我的项目目录如下


|公司/(头文件)
| 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/%。c

据我所知一切都应该没问题,但是当我从根目录

进入make时,我得到了这个错误
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.

有人能找到我在这里做错了什么吗?我已经纠结了好几天了

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

你也可以看看用类似的规则为一个微型非递归make框架构建多个可执行文件

您的编译器正在寻找inc/shell.h,这是不应该的。一般来说,源文件中不应该有依赖于构建系统的路径,但构建系统的细节应该通过编译器标志来定义。

也就是说,你的源文件src/shutil.c应该是这样的:

#include "shell.h"

和你的编译器调用是一样的,- i传递包含路径。

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

好吧,这让我很沮丧,但我现在明白了。我更改了顶部的定义,以包括文件路径,如下所示:

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

似乎关键是-I。/inc,而不是我期望的- ininc。

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

最新更新