• [makefile]如何设置不同目录的代码(.c),生成到指定目录下(./debug/.o))


    部分代码跟makefile不在同一目录,有没有好的方法来设置依赖关系,我找到三种方法,但感觉都不完美,下面我会把他列出来并加以说明,不知有没有更好的方法,makefile本身也不是很熟,请大家指教;

    需求如下:
    1)目录结构所下所示
    [src1](目录):
    src11.c
    src12.c
    src13.c...
    makefile
    [src2](目录):
    src21.c
    src22.c
    ...
    2)写makefie时,不想每一个文件都写上依赖关系,希望能够让其自动推导,但会列出.c的文件及路径,如下图code部分所示;
    3)生成的.o与makefile不在同一目录,如./debug,如果是同一个目录,还是可以解决的,但感觉临时文件太多,不大好;

    1. OUTPUT                = ./debug
    2. SOURCES         = $(wildcard ./*.c)  $(wildcard ../src2/*.c)
    3. DIR_OBJS        = $(patsubst %.c,%.o,$(SOURCES))
    4. OBJS_NAME        = $(notdir $(patsubst %.c,%.o,$(SOURCES)))
    5. OBJS          = $(addprefix $(OUTPUT)/,$(notdir $(patsubst %.c,%.o,$(SOURCES)))) 
    6. LDFLAGS                +=
    7. #vpath 方式2需要
    8. vpath %.c $(addsuffix :,$(dir $(patsubst %.c,%.o,$(SOURCES)))))
    9. all: $(TARGET)
    10. $(TARGET):$(OUTPUT) $(OBJS)
    11.         $(CC) $(OBJS) $(LDFLAGS) -o $(TARGET)
    12. 方法1:
    13. $(OBJS):$(SOURCES)
    14.         $(CC) $(CFLAGS) -o $@ -c $(filter %$(*F).c,$(SOURCES))        
    15. #该方式,有一个缺点,就是依赖于每一个src,只要一个src更改了,都会导致所有.o都需要重新依赖;
    16. # 方式2
    17. $(OBJS):$(OBJS_NAME)
    18.         cp $(*F).o $(OUTPUT)/
    19. ##若此时目标(objs_name)带路径,则.c搜索无法使用指定的搜索路径
    20. $(OBJS_NAME): %.o : %.c
    21.         $(CC) $(CFLAGS) -o $(OUTPUT)/$@ -c $<
    22. #该方式,如果生成的.o带上路径,则.c就无法通过vpath指定的路径搜索.c,就会直接到指定的.o所在目录搜索,如果用这种方式,那么makefile所在的.o的方式太多了..
    23. # 方式3
    24. $(OBJS):$(DIR_OBJS)
    25. #
    26. $(DIR_OBJS):%.o : %.c
    27.         $(CC) $(CFLAGS) -o $@ -c  $<
    28.         mv $@ ./debug/        
    29. #该方式,如果src下的.o已经存在(dir_objs),那么就不会重新编译,要假设环境...
  • 相关阅读:
    beego学习笔记(4):开发文档阅读(1)
    go的匿名组合
    beego学习笔记(3)
    beego学习笔记(2)
    python发送post请求发送json数据时,报415的原因和处理方法。
    Kali Linux的安装
    linux下配置mysql的远程访问
    selenium学习笔记
    Fiddler使用方法简介
    使用webdriver打开本地浏览器--python版
  • 原文地址:https://www.cnblogs.com/canphp/p/4568187.html
Copyright © 2020-2023  润新知