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

发布于 2022-09-13 04:52:21 字数 2258 浏览 7 评论 4

本帖最后由 wjefen 于 2010-04-17 11:51 编辑

部分代码跟makefile不在同一目录,有没有好的方法来设置依赖关系,我找到了三种方法,但感觉都点缺点,下面我会把他列出来并加以说明,不知有没有更好的方法,makefile本身也不是很熟,请大家指教;
需求如下:
1)目录结构所下所示
[src1](目录):
src11.c
src12.c
src13.c...
makefile
[src2](目录):
src21.c
src22.c
...
2)写makefie时,不想每一个文件都写上依赖关系,只希望能够让其自动推导,但会列出.c的文件及路径;
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),那么就不会重新编译,要假设环境...

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

So要识趣 2022-09-20 03:07:25

是你Makefile不熟,还说我们不热心,毕竟这种小case我们都没时间考虑。

隐诗 2022-09-19 16:25:07

用automake

妄想挽回 2022-09-18 09:40:54


这个版块好像没啥人啊。。。
论坛首页上好像都看不到最新发表时间了。。
看来得换个地方再发一下。。。
。。。

孤云独去闲 2022-09-16 01:57:38

也不知是不是发这里,好像找了整个版面,感觉都不是很合适...
看看这个和编译有关的,就发这儿了,如果不合适,请版主移动到合适的版面...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文