c - 包含多个文件的 Makefile 总是构建一切

标签 c makefile dependencies gnu-make

我正在编写一个编译多个 C 文件的 Makefile,一些与 Makefile 位于同一目录中,另一些位于父目录中(由于历史原因必须存在)。我想将所有 *.o 文件放在一个目录中(在我的例子中是 objdir)。这似乎可行,但出于某种原因,这个 Makefile 总是构建所有内容,即使没有任何更改。我的规则/依赖项哪里出错了?

更新:我已经将我的 Makefile 和源代码提炼到最低限度(请参阅下面的源文件内容。要清楚,这会编译和链接。问题是它会在我每次运行时进行编译和链接make,即使什么都没有改变。这不是典型的 make 行为。

生成文件内容:

CC = gcc
CFLAGS = -g -Wall -Werror -I..
SRCS = main.c ../a.c
OBJS = $(patsubst %.c, objdir/%.o, $(SRCS))
LN_OBJS = $(patsubst %.c, objdir/%.o, $(notdir $(SRCS)))
MAIN = foo

.PHONY: clean

default: objdir $(MAIN)
    @echo  Done

$(MAIN): $(OBJS) 
    $(CC) $(CFLAGS) -o $(MAIN) $(LN_OBJS    )

objdir/%.o: %.c
    $(CC) $(CFLAGS) -c $< -o objdir/$(notdir $@)

objdir:
    @mkdir -p objdir

clean:
    @$(RM) -rf objdir $(FDP) $(DK)

main.c 内容

#include "stdlib.h"
#include "stdio.h"

#include "a.h"

int main(int argc, char**argv)
{
    printf("Hello\n");
    a();
}

../a.c内容

#include <stdio.h>

void a()
{
    printf("Hi from a\n");
}

../a.h内容

#ifndef __a__
#define __a__

void a();

#endif

最佳答案

objdir/%.o: 的规则扩展为 objdir/../a.o: ../a.c,但您随后创建了 objdir/$(notdir $@),违反了 Rules of Makefiles 的规则 2 .

解决此问题的一种方法是使用 vpath(还要注意 objdir 应该是对象的(仅顺序)依赖项):

SRCS = main.c a.c
vpath %.c ../
# [...]
objdir/%.o: %.c | objdir
    $(CC) $(CFLAGS) -c $< -o $@

关于c - 包含多个文件的 Makefile 总是构建一切,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42755474/

相关文章:

c - Makefile:为什么带有 % 的 makefile 不起作用?

python - 如何导出以包含所有依赖项的方式开发的 python 包,以便在另一台机器上进行离线安装?

c# - 获取对依赖关系图中深度嵌套的类的一组依赖关系

c - FreeBSD:网络接口(interface)地址:dhcp 或 static

c++ - 在 c/c++ 中使用 extern 背后的概念是什么?

linux - 如何更新make 3.81 linux

android - 为什么gradle认为我的 'libraries'目录是一个项目

c - 为什么在 malloc 调用中引用 undefined object 有效?

c++ - Linux:如何测量进程内线程的内存使用情况?

c++ - undefined reference to with inheritance, makefile 问题?