【问题标题】:Makefile SubdirectoriesMakefile 子目录
【发布时间】:2011-12-23 06:13:55
【问题描述】:

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

贝壳
|inc/[头文件]
|obj/[目标文件]
|src/[源文件]
|生成文件
|可执行

根文件夹中的所有内容都可以正常编译,但我在修改我的 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

据我所知,一切都应该没问题,但是当我从根目录进行 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..?我个人会将 *.o 构建到 src 的 makefile 中,并将最终结果构建到 build 的 lib 文件中。我不是说这是最好的,只是我是怎么做的。如果您想查看我的 Makefile 示例,请参阅 here
  • 我无法重现该错误,而且我使用的是完全相同的命令。你能发布你正在使用的实际makefile吗?另外,您使用的是什么版本的 gcc?
  • 看起来您将 shutil.c 更改为 #include "inc/shell.h"。将其改回“shell.h”,-Iinc 应该会选择它。

标签: c makefile subdirectory


【解决方案1】:

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

您还可以查看 Building multiple executables with similar rules 以了解微型非递归 make 框架。

【讨论】:

    【解决方案2】:

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

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

    #include "shell.h"
    

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

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

    【讨论】:

    • 这并不是最好的做法。它不能很好地扩展(想象一个有几个 shell.h 头文件的项目)。最好让头文件目录复制命名空间(C 中的前缀)结构,如“namespace_a/shell.h”、“namespace_b/shell.h”。
    • @MaximYegorushkin:我同意,尽管在这种情况下任何头目录都不应该称为“inc”。我以为他在 inc 中有逻辑子目录。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 2021-05-19
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      相关资源
      最近更新 更多