【问题标题】:Makefile: compile .o from .c filesMakefile:从 .c 文件编译 .o
【发布时间】:2016-01-05 21:15:58
【问题描述】:

我对 Makefile 没有太多经验,所以答案可能很明显。但是,我无法在 GNU make 手册或 stackoverflow 的其他地方找到我要查找的内容。这个问题我遇到过几次,所以我做了一个示例项目来演示它。

我有目录:

  • src/ 用于 .c 文件
  • 为正在构建的库构建/
  • obj/ 用于所有 .o 文件(一个从不同项目编译的文件)

它的样子:

$ ls -l
total 0
drwxrwxr-x+ 1 sam None 0 Jan  5 15:43 build
drwxrwxr-x+ 1 sam None 0 Jan  5 15:43 obj
drwxrwxr-x+ 1 sam None 0 Jan  5 15:42 src

我的 Makefile:

CC=gcc
CFLAGS=-Wall

SOURCES=$(wildcard src/*.c)
SOURCE_OBJECTS=$(patsubst src/%.c,obj/%.o,$(SOURCES))

OBJECTS=$(wildcard obj/*.o)

HASHSRC=/cbib/libhash/src/hash.c

TARGET=target.a

all: $(TARGET)

$(TARGET): $(OBJECTS)
    ar rcs $@ $^

obj/%.o: src/%.c
    $(CC) -o $@ $^ $(CFLAGS)

obj/hash.o: $(HASHSRC)
    $(CC) -o $@ $^ $(CFLAGS)

规则

obj/%.o: src/%.c

捕获 obj/ 目录中的所有 .o 文件。但是我只希望它捕获 SOURCE_OBJECTS 中列出的文件,并从 src/ 目录中的相应文件编译它们。我该怎么做?

【问题讨论】:

    标签: c makefile


    【解决方案1】:

    OBJECTS=$(wildcard obj/*.o) 为空,因为wildcard 只返回现有文件。你应该依赖$(TARGET)中的$(SOURCE_OBJECTS)

    处理多个输入源时可以narrow down the selection:

    # dest files        dest pattern  source pattern
    $(SOURCE_OBJECTS):  obj/%.o:      src/%.c
        $(CC) -o $@ $^ $(CFLAGS)
    

    Makefile 中还有一些小错误(或缺点)。例如。谁创建目录obj/?为此,您可以在以下目录中depend

    obj/%.o: | obj/
    
    obj/:
        mkdir -p $@
    

    【讨论】:

    • 正是我想要的...感谢您的快速回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多