gpt4 book ai didi

c - Makefile:分离源和对象

转载 作者:行者123 更新时间:2023-11-30 14:31:50 24 4
gpt4 key购买 nike

一段时间以来,我一直在尝试将项目的源文件与生成的目标文件分开。

确实,我希望我的项目能够这样构建:

obj/
main.o
src1.o
[...]
src/
main.c
src1.c
[...]
Makefile

我目前的Makefile如下:

NAME                =       a.out

OBJ_DIR = "obj"
SRC_DIR = "src"

MAIN_SRC = main.c

PROJ_SRC = src1.c \
src2.c \
src3.c

MAIN_OBJ = $(MAIN_SRC:%.c=%.o)

PROJ_OBJ = $(PROJ_SRC:%.c=%.o)

CC = gcc
RM = rm -rf

$(NAME): $(MAIN_OBJ) $(PROJ_OBJ)
$(CC) $(MAIN_OBJ) $(PROJ_OBJ) -o $(NAME)

all: $(NAME)

clean:
$(RM) $(MAIN_OBJ) $(PROJ_OBJ)

fclean: clean
$(RM) $(NAME)

我尝试使用 pattern rules ,没有成功。

MAIN_OBJ            =       $(MAIN_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)

PROJ_OBJ = $(PROJ_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)

[...]

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@

有人能解决我的问题吗?

最佳答案

MAIN_SRCPROJ_OBJ 没有目录前缀,因此表达式

$(MAIN_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
$(PROJ_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)

不要替换任何东西。

修复:

MAIN_OBJ := $(MAIN_SRC:%.c=$(OBJ_DIR)/%.o)
PROJ_OBJ := $(PROJ_SRC:%.c=$(OBJ_DIR)/%.o)

然后你的模式规则就应该起作用了。

您可能希望让 make 为您创建该 $(OBJ_DIR):

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
$(CC) $(CFLAGS) -c -o $@ $<

$(OBJ_DIR) :
mkdir -p $@
<小时/>

A more advanced example for you with automatic header dependency generation .

关于c - Makefile:分离源和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60055135/

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