【问题标题】:Makefile: Efficient way to make all '.c' files depend on a header file with the same name?Makefile:使所有“.c”文件依赖于同名头文件的有效方法?
【发布时间】:2010-06-25 19:28:28
【问题描述】:

我有一个包含 50 个 .c 源文件的目录,这些 .c 文件中的每一个都依赖于一个具有相同名称的 .h 文件和一个公共头文件。

例子:

foo.c depends on foo.h and common.h
bar.c depends on bar.h and common.h
baz.c depends on baz.h and common.h

是否可以设置此依赖项而无需为每个 .c 文件创建单独的目标?

如果重要的话,这个 Makefile 的最终输出将是一个 libfoo.a 库,其中包含每个 .o 文件。

编辑

如果可能的话,我想使用gnu make 语法来执行此操作,并且不为每个文件设置一个目标,无论该目标是手动创建的还是由makedepend 之类的东西创建的。

【问题讨论】:

标签: c header makefile


【解决方案1】:

据我所知,这应该足够了。

%.o: %.c %.h common.h
\tgcc -c $<

\t 是一个标签,gcc -c $&lt; 当然只是一个例子。

【讨论】:

    【解决方案2】:
    OBJECTS = $(patsubst %.c,%.o,$(wildcard *.c))
    %.o: %.c %.h common.h
        gcc -c $< -o $@
    
    libfoo.a: $(OBJECTS)
        ar rcs $@ $^
    

    【讨论】:

    • 有点晚了。这几乎正​​是我正在做的,除了我使用$(AR) $(ARFLAGS) $@ $? 并且我没有在gcc 行中指定-o $@ 部分。 +1 寻求帮助。
    • 顺便说一句,我喜欢将$(wildcard) 嵌套在模式子中而不需要SOURCES 变量的想法,但我无法让它工作。也许你需要$(patsubst)
    • 是的,这行得通 --> OBJECTS = $(patsubst %.c,%.o,$(wildcard *.c))
    • 你是对的。似乎替换引用和patsubst 形式仅在您转换存储在变量中的文本时才等效,而不是在使用嵌套命令时。编辑我的答案以修复错误。
    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2013-09-09
    相关资源
    最近更新 更多