gpt4 book ai didi

makefile - 简洁的 Makefile

转载 作者:行者123 更新时间:2023-12-04 20:22:08 29 4
gpt4 key购买 nike

我正在做一些 Makefile 重构,并试图找出最简洁的方法来实现一个 Makefile,它执行以下操作:

  • 有一个变量列出了所有源文件(可以是 C 和 C++ 文件)
  • 所有目标文件都在 OBJ_DIR
  • 中生成
  • 如果对象目录不存在,则创建该目录

  • 这是我到目前为止所拥有的:
    ...

    OBJ_DIR = obj/
    BIN_DIR = bin/
    PROGRAM = program

    SRCS = test1.cpp test2.c

    OBJS = $(addprefix $(OBJ_DIR), \
    $(patsubst %.cpp, %.o, \
    $(patsubst %.c, %.o, $(SRCS))))

    $(BIN_DIR)$(PROGRAM) : $(OBJS)
    $(CREATE_OUT_DIR)
    $(LINK)

    $(OBJ_DIR)%.o : %.c
    $(CREATE_OBJ_DIR)
    $(CCOMPILE)

    $(OBJ_DIR)%.o : %.cpp
    $(CREATE_OBJ_DIR)
    $(CPPCOMPILE)

    ...

    我想为每个 .o 编译消除对 $(CREATE_OBJ_DIR) 的调用。有人知道怎么做吗?我尝试添加它,但它不会构建目标文件:
    $(OBJS): | $(OBJ_DIR)

    $(OBJ_DIR):
    $(CREATE_OBJ_DIR)

    最佳答案

    你似乎已经解决了你的第一点:将它们全部放在一个变量中(我不应该认为你真的需要像你一样将它们分成 TEMP1 和 TEMP2,只是有不同的构建规则)

    对于第二点,您可以告诉编译器在哪里输出目标文件(对于 g++,它是这样的:

    g++ -c MySourceFile.cpp -o obj/MySourceFile.o

    对此的 make 规则如下所示:
    obj/%.o: %.cpp
    g++ -c $*.cpp -o obj/$*.o

    你的第三点也很容易解决,因为你可以有一个构建规则(在列出所有对象之前,只需将目录名称放在目标的依赖列表中),构建规则看起来像这样
    obj:
    mkdir obj

    编辑:或按照您的代码示例:
    $(BIN_DIR)$(PROGRAM) : $(BIN_DIR) $(OBJS) 
    $(LINK)

    $(BIN_DIR):
    $(CREATE_OUT_DIR)

    关于makefile - 简洁的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5325883/

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