gpt4 book ai didi

c - Makefile:两个不同的可执行文件采用两个重叠的代码子集

转载 作者:太空宇宙 更新时间:2023-11-04 02:42:02 26 4
gpt4 key购买 nike

这是我的情况,我正在尝试为我的 c 程序编写一个 Makefile,它包含这些组件 --

  • 2 个标题:

    1. src/header1.h
    2. src/header2.h
  • N资料来源:

    1. src/src1.c
    2. src/src2.c
    3. src/src3.c ...
    4. src/srcn.c
  • 2 个电源:

    1. src/main1.c
    2. src/main2.c

main1.cmain2.c都一样src*.cheader*.h文件,但以不同的方式。如果我能以这种方式编写我的 Makefile 那就太好了 --

CC          := gcc
INCLUDES := $(wildcard src/*.h)
SRC1 := all src*.c sources and main1.c (not main2.c)
SRC2 := all src*.c sources and main2.c (not main1.c)
IFLAGS := $(addprefix -I/,$(INCLUDES))
CFLAGS := -g -Wall -pedantic -std=gnu99 $(IFLAGS)
LDFLAGS := -lm
OBJS1 := all objects from src*.c (i.e. src*.o) and main1.o
OBJS1 := all objects from src*.c (i.e. src*.o) and main2.o
APP1 := app1
APP2 := app2

all: $(APP1) $(APP2)

$(APP1): $(OBJS1)
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

$(APP2): $(OBJS2)
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

$(OBJS1): $(SRC1)
$(CC) $(CFLAGS) -o $@ -c $<

$(OBJS2): $(SRC2)
$(CC) $(CFLAGS) -o $@ -c $<

clean:
rm $(OBJS1)
rm $(OBJS2)
rm $(APP1)
rm $(APP2)

如何为 $SRC1 编写目标/先决条件规则, $SRC2 , $OBJS1$OBJS2以上?

最佳答案

COMMON = \
src1.c \
src2.c \
... \
srcn.c

MAIN1 = main1.c
MAIN2 = main2.c
COMOBJ = ${COMMON:.c=.o}
OBJS1 = ${MAIN1:.c=.o} ${COMOBJ}
OBJS2 = ${MAIN2:.c=.o} ${COMOBJ}

我经常编写诸如 MAIN1.c = main1.c 之类的宏,因为 POSIX 需要 make 来支持该表示法(以及我遇到的所有变体 支持它)。但要注意 vim 并不认为像那​​样的宏名称是合乎规范的(这是 vim 识别 make 宏的错误) .然后我会写:

COMMON.c = ...
MAIN1.c = main1.c
...

FILES1.o = ${MAIN1.c:.c=.o} ${COMMON.c:.c=.o}

等不是每个人都喜欢这种表示法。

关于c - Makefile:两个不同的可执行文件采用两个重叠的代码子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30880704/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com