【问题标题】:How to set in a Makefile the folder in which files are created?如何在 Makefile 中设置创建文件的文件夹?
【发布时间】:2016-10-27 10:44:50
【问题描述】:

我对项目进行了组织,以便在子目录code/ 中找到所有代码文件。我有两个 Makefile,一个在主目录,一个在 code/ 子目录。

主目录中的 Makefile 包含(that post 的道具):

# .PHONY rule means that project_code is not a file that needs to be built
.PHONY: project_code

project_code:
    $(MAKE) -C $(CODE_DIR)

clean:
    $(MAKE) -C $(CODE_DIR) clean

all: exe

code/ 子目录中的 Makefile 包含如下内容:

exe: $(OBJECTS)
    $(CC) $(CFLAGS) -o $@ $^ -fopenmp -lpng

%.o: %.c
    $(CC) $(CFLAGS) -c $< 

当我现在从主目录运行make 时,exe 文件是在code/ 子目录中创建的,但我想将它放在主目录中。我的问题:我怎样才能做到这一点?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    请参考这个例子:

    #Name of outpu binary (exe) file;
    PROGRAM_NAME := prog
    
    # project dirs
    export SRC_DIRS     := ./src1 ./src2
    export INCLUDE_DIRS := ./include
    
    #list of source files (with whitespace between them)
    SRC_FILES := $(foreach dirname, $(SRC_DIRS), $(wildcard $(dirname)/*.c))
    
    #Object files
    OBJ_FILES := $(foreach filename, $(SRC_FILES), $(filename:.c=.o))
    
    # Include flags
    LOCAL_INCLUDES=$(foreach dirs, $(INCLUDE_DIRS), -I$(dirs))
    
    
    # list of lib-flags for compiler. For example for math.h use    -lm
    #LIB_FLAGS=-lm
    CC=gcc
    CFLAGS=-Wall $(LIB_FLAGS) $(LOCAL_INCLUDES)
    
    #build executable file
    $(PROGRAM_NAME): $(OBJ_FILES)
            @echo "Build executable"
            @$(CC) $(CFLAGS) -o $@ $^
    
    # compile all object file
    %.o: %.c
            @echo "Compile $(notdir $<)"
            @$(CC) -c $(CFLAGS) $< -o $@
    
    #clean all
    clean:
            @rm -f $(OBJ_FILES) $(PROGRAM_NAME)
    

    它只有 1 个 Makefile。它从列出的目录中获取源,在相同的目录中创建对象,然后链接到当前(顶部)目录中的二进制文件

    【讨论】:

    • 一开始我不明白export...,为什么你使用@$(CC) 而不是$(CC) ....?但你确实帮助了我,这就是我需要的灵感!
    • export 通常用于从其他 Makefile 调用一个 make 的大型构建系统中。 export 使变量在所有嵌套的 make 调用中都可用。目标中的@ before 命令将命令的'echo'转为'echo'(默认情况下,make 在执行之前打印命令,@ 关闭此打印)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2013-06-27
    相关资源
    最近更新 更多