[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),那么就不會重新編譯,要假設環境...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM