免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 14191 | 回复: 12
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-17 22:29 |只看该作者 |倒序浏览
本帖最后由 wjefen 于 2010-04-19 11:11 编辑

好像这边人比较多,早上在编译器版块问了下,ms没啥人,跑这里再问下!

部分代码跟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),那么就不会重新编译,要假设环境...
复制代码
有人说,有错别字了,改下.....

论坛徽章:
0
2 [报告]
发表于 2010-04-17 22:38 |只看该作者
本帖最后由 sunlan 于 2010-04-17 22:45 编辑

用VPATH吧,应该能解决你的问题

没看明白你说的推导是指的什么。

如果你嫌目录下的.o多,大不了加个clean

论坛徽章:
0
3 [报告]
发表于 2010-04-17 23:10 |只看该作者
VPATH是变量,类似环境变量
vpath是可以指定模式的,这个功能相对全些

推导是说我的target由o生成的,而.o是由.c生成的,当发现某.o不存在时,会根据我指定的编译原则编译.c, 从而生成.o..
但可以指定.o及.c的路径,但不想为每个.o定义依赖关系及编译原则

clean是有,但不会每次都要去clean去,而且clean 以后,我修改了不要又要编译了。。

论坛徽章:
0
4 [报告]
发表于 2010-04-17 23:13 |只看该作者
VPATH跟vpath 一样的,在你指定了路径后,就会直接到该路径下搜索,而不会去指定的搜索的路径搜索的。。
因为我生成的.o,我是想放到./output/下,如果直接放在当前目录下是没有问题的,这个我在方法2的说明上提到过的。。

论坛徽章:
0
5 [报告]
发表于 2010-04-18 07:54 |只看该作者
是不是说想生成的.o放到指定的目录?


$(OBJS): $(OUTPUTDIR)/%.o : $(SRCDIR)/%.c
    $(CC) -o $@ -c $< $(CFLAGS)

如果src来源不同

那么定义src1 src2 ... 对应obj1 obj2 ...

然后分别使用上面的静态格式规则。

$(OBJS1): $(OUTPUTDIR1)/%.o : $(SRCDIR1)/%.c
    $(CC) -o $@ -c $< $(CFLAGS)

$(OBJS2): $(OUTPUTDIR2)/%.o : $(SRCDIR2)/%.c
    $(CC) -o $@ -c $< $(CFLAGS)

... ...

论坛徽章:
0
6 [报告]
发表于 2010-04-18 08:35 |只看该作者
是差不多这个意思...
但照LS这么方法的话,还要每个目录 都上写上一段,感觉也比较麻烦
而且通用性会相对比较差了...
而且拷到其他地方去,还要改好几个地方,目录多了或少了,还要去改依赖关系..

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2010-04-18 08:54 |只看该作者
把如何写成如果的,都不是好程序员。

论坛徽章:
0
8 [报告]
发表于 2010-04-18 09:04 |只看该作者
这年头有编译器,写错了会报错的...

改下..

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2010-04-18 09:31 |只看该作者
这年头有编译器,写错了会报错的...

改下..
wjefen 发表于 2010-04-18 09:04

rm *>o 可不会报错的。

论坛徽章:
0
10 [报告]
发表于 2010-04-18 09:38 |只看该作者
还扯上瘾了...
这么有空,帮我解决下问题吧...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP