Makefile - 移动目标文件

 兰州老头_337 发布于 2022-12-19 18:40

经过一些搜索,我成功地将以下Makefile放在一起:

CC = gcc
CFLAGS = -c -Wall
LDFLAGS = 
SOURCEFILES = main.c
SOURCES = src/$(SOURCEFILES)
OBJECTS = $(SOURCES:.c=.o)
EXECUTABLE = netsim

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

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

clean:
    rm -rf netsim $(OBJECTS)

我希望能够将我的目标文件移动到另一个目录中,但一直在努力使其工作.我错过了什么?

1 个回答
  • 诀窍是不要移动你的对象.
    您应该构建它构建它们的地方使用它.

    例如,您具有以下目录结构:

    $ tree .
    ??? Makefile
    ??? include
    ?   ??? common_head.h
    ??? obj
    ??? src
        ??? foo.c
        ??? main.c
    

    手动执行:

    $ gcc -o ./obj/foo.o  -c ./src/foo.c  -I ./include  # Build Object #
    $ gcc -o ./obj/main.o -c ./src/main.c -I ./include
    $ gcc -o exe ./obj/foo.o ./obj/main.o               # Build Executable #
    

    Makefile来模拟上面的内容

    C_FLAGS := -g -Wall -Wextra
    CC := gcc
    RM := rm
    LINKFLAGS := -lanylibrary
    
    .PHONY: $(TARGET)
    .PHONY: clean
    
    VPATH:= ./src/ ./obj/ ./include/
    
    # Path for .c , .h and .o Files 
    SRC_PATH := ./src/
    OBJ_PATH := ./obj/
    INC_PATH := -I ./include
    
    # Executable Name 
    TARGET := exe
    
    # Files to compile
    OBJ1 := foo.o \
            main.o
    
    OBJ := $(patsubst %,$(OBJ_PATH)%,$(OBJ1))
    
    # Build .o first
    $(OBJ_PATH)%.o: $(SRC_PATH)%.c
                    @echo [CC] $<
                    @$(CC) $(C_FLAGS) -o $@ -c $< $(INC_PATH)                  
    
    # Build final Binary
    $(TARGET):      $(OBJ)
                    @echo [INFO] Creating Binary Executable [$(TARGET)]
                    @$(CC) -o $@ $^ $(LINKFLAGS)
    
    # Clean all the object files and the binary
    clean:   
                    @echo "[Cleaning]"
                    @$(RM) -rfv $(OBJ_PATH)*
                    @$(RM) -rfv $(TARGET)
    

    所以,当你做一个Make

    $ make -B
    [CC] src/foo.c
    [CC] src/main.c
    [INFO] Creating Binary Executable [exe]
    

    看干运用 make -n

    $ make clean ; make -n
    g++ -g -Wall -Wextra -o obj/foo.o  -c src/foo.c  -I ./include
    g++ -g -Wall -Wextra -o obj/main.o -c src/main.c -I ./include
    g++ -o  exe  obj/foo.o obj/main.o -lanylibrary
    

    因此,在构建目录结构后,应该如下所示.

    $ tree .
    ??? Makefile
    ??? exe
    ??? include
    ?   ??? common_head.h
    ??? obj
    ?   ??? foo.o
    ?   ??? main.o
    ??? src
        ??? foo.c
        ??? main.c
    

    从我之前的回答.
    您不必使用任何PHONY move对象,也不会不必要地重新创建对象.

    2022-12-19 18:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有