Makefile - 单独编译C文件

问题描述 投票:0回答:1

我的文件夹结构是这样的:

build
ch01
  foo.c
  bar.c
ch02
  baz.c
  meow.c

每个文件都是一个单独的程序,必须放入

build/
目录中具有相同名称的子文件夹中(整个构建位于
.gitignore
中)

build
  ch01
    foo, bar
  ch02
    baz, meow  

目前我有这个 Makefile 做我需要的事情,但我不喜欢它。

CC   = gcc
CFLAGS  = -g -Wall -Wextra -ansi
SRCS   = $(wildcard *.c)
OBJS  = $(patsubst %.c,%.o,$(SRCS))
MD   = mkdir
BINPREFIX = ../build
BUILD_DIR = $(BINPREFIX)/$(shell basename $(CURDIR))

all: $(OBJS)

$(OBJS): %.o: %.c
 @test -d $(BUILD_DIR) || $(MD) -p $(BUILD_DIR)
 $(CC) -c $(CFLAGS) $<
 $(CC) $@ -o $(patsubst %.o,$(BUILD_DIR)/%,$@)
 rm $@


clean:
 rm -rf $(BUILD_DIR)

有两个问题。

  1. 我必须通过手动删除目标文件来分割编译/链接阶段,因为我无法提供更好的解决方案来从完整构建路径中恢复源文件名。
  2. 我想为目录创建设置单独的目标,但标准推荐不起作用:
all: $(OBJS) | $(BUILD_DIR)

$(BUILD_DIR):
  $(MD) -p $@

它根本不运行

$(BUILD_DIR)
目标。

c gcc makefile gnu-make
1个回答
0
投票

我最终得到了这个Makefile

CC          = gcc
CFLAGS      = -Wall -Wextra -ansi
MD          = mkdir
BINPREFIX   = ../build
BUILD_DIR   = $(BINPREFIX)/$(shell basename $(CURDIR))
SRCS        = $(wildcard *.c)
BINS        = $(patsubst %.c,$(BUILD_DIR)/%,$(SRCS))

all: $(BINS)

$(BUILD_DIR):
    $(MD) -p $(BUILD_DIR)

$(BINS): $(BUILD_DIR)/%: %.c | $(BUILD_DIR)
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm -rf $(BUILD_DIR)

首先,我从当前目录中的所有 c 文件中创建一组目标,并在它们前面加上我想要放置所有二进制文件的

bin
目录。然后
$(BUILD_DIR)/%: %.c
执行相反的操作 - 将每个目标转换为源文件名。

© www.soinside.com 2019 - 2024. All rights reserved.