繁体   English   中英

Makefile:从.c文件编译.o

[英]Makefile: compile .o from .c files

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

我有目录:

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

看起来像什么:

$ 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 /目录中的相应文件进行编译。 我该怎么做?

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

处理多个输入源时,可以缩小选择范围

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

Makefile中还有其他小错误(或缺点)。 例如,谁创建了目录obj/ 为此,您可以依赖目录,例如:

obj/%.o: | obj/

obj/:
    mkdir -p $@

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM