免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: net_robber
打印 上一主题 下一主题

【30日更新】Makefile(用于多目录 源代码 编译)-56楼提供最新版本下载 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2007-03-20 17:57 |只看该作者
我先 gmake dir 生成目录, 然后在 src/ 下建了三文件: a.h a.c main.c
deps:
a.c: a.h
main.c: a.h

以下是测试结果:

$ gmake
gcc src/a.c -MM -o obj/a.d
gcc -c -g src/a.c -o obj/a.o
gcc src/main.c -MM -o obj/main.d
gcc -c -g src/main.c -o obj/main.o
gcc obj/a.o obj/main.o -o debug/out
rm obj/a.d obj/main.d

$ touch src/a.h

$ gmake
gmake: Nothing to be done for `all'.

论坛徽章:
0
42 [报告]
发表于 2007-03-20 18:07 |只看该作者
原帖由 I/0 于 2007-3-20 17:57 发表
我先 gmake dir 生成目录, 然后在 src/ 下建了三文件: a.h a.c main.c
deps:
a.c: a.h
main.c: a.h

以下是测试结果:

$ gmake
gcc src/a.c -MM -o obj/a.d
gcc -c -g src/a.c -o obj/a.o
gcc src/main ...



是这样的,依赖关系不是靠名字相同检查的

要求.c文件中,有include  .h文件,才会出现依赖

也就是说。你要在a.c Includ a.h

论坛徽章:
0
43 [报告]
发表于 2007-03-21 08:59 |只看该作者
原帖由 net_robber 于 2007-3-20 18:07 发表



是这样的,依赖关系不是靠名字相同检查的

要求.c文件中,有include  .h文件,才会出现依赖

也就是说。你要在a.c Includ a.h


呵呵, 我是嫌帖那几个文件的源码太长才简单地用 deps: a.c: a.h  main.c a.h 描述了一下include关系,
a.c 和 main.c 里面都有 include "a.h"

论坛徽章:
0
44 [报告]
发表于 2007-03-21 11:32 |只看该作者
确实有问题


正在研究。

请稍后

论坛徽章:
0
45 [报告]
发表于 2007-03-21 13:39 |只看该作者
不错,楼主能不能花点时间解释一下每行,让我只懂一点的人,用你这个,也知其所以然.

论坛徽章:
0
46 [报告]
发表于 2007-03-21 15:15 |只看该作者
先不解释

还有点问题

论坛徽章:
0
47 [报告]
发表于 2007-03-22 17:51 |只看该作者
已经找到不能正确检查头文件依赖的原因了

因为gcc自动生成的依赖规则中,目标文件并没有加入路径。

因此,他没有按照预期的规则进行检查、编译

论坛徽章:
0
48 [报告]
发表于 2007-03-22 18:09 |只看该作者

  1. # Readme:
  2. # use: make config
  3. # use: make dir
  4. # use: make
  5. # use: make clean
  6. # use: make rebuild
  7. # use: make cleanall
  8. # use: make test
  9. # use: make

  10. # firs of all, use "make config" or "make dir" to
  11. # build a source files struct. and then,
  12. # put your source files into the DIR src
  13. # link libs to the DIR lib
  14.        

  15. SHELL=/bin/sh
  16. CC=gcc
  17. CXX=g++
  18. MAKE=make
  19. MAKE_DIR=$(PWD)
  20. SRC_DIR=$(MAKE_DIR)/src/
  21. OBJ_DIR=$(MAKE_DIR)/obj/
  22. LIB_DIR=$(MAKE_DIR)/lib/
  23. DEBUG_DIR=$(MAKE_DIR)/debug/
  24. RELEASE_DIR=$(MAKE_DIR)/release/
  25. OUTPUT_DIR=
  26. LIB=-L$(MAKE_DIR)/lib/
  27. OUTPUT_FILE=out
  28. OUT=

  29. vpath %.c $(SRC_DIR)
  30. #vpath %.o $(OBJ_DIR)
  31. vpath %.d $(OBJ_DIR)



  32. DEBUG=1

  33. SRC_FILES:=$(wildcard $(SRC_DIR)*.c)
  34. SRC_FILES:=$(notdir $(SRC_FILES))
  35. OBJ_FILES:=$(patsubst %.c,%.o,$(SRC_FILES) )
  36. DEP_FILES:=$(patsubst %.c,%.d,$(SRC_FILES) )

  37. #SRC_FILES:=$(addprefix $(SRC_DIR),$(SRC_FILES))
  38. #OBJ_FILES:=$(addprefix $(OBJ_DIR),$(OBJ_FILES))
  39. DEP_FILES:=$(addprefix $(OBJ_DIR),$(DEP_FILES))

  40. FLAG_DEBUG=-g
  41. FLAG_COMPLE=-c
  42. FLAG_LINK=

  43. ifeq ($(DEBUG),1)
  44. OUTPUT_DIR:=$(DEBUG_DIR)
  45. FLAG_COMPLE:=$(FLAG_COMPLE) $(FLAG_DEBUG)
  46. FLAG_LINK:=
  47. else
  48. OUTPUT_DIR:=$(RELEASE_DIR)
  49. FLAG_COMPLE:=$(FLAG_COMPLE)
  50. FLAG_LINK:=
  51. endif

  52. OUT=$(OUTPUT_DIR)$(OUTPUT_FILE)

  53. $(OUT): $(OBJ_FILES)
  54.         @echo 1
  55.         @$(CC) $^ -o $@
  56. %.o:%.c %.d
  57.         @echo 2.1
  58.         @$(CC) $(FLAG_COMPLE) $< -o $@
  59. $(OBJ_DIR)%.d:%.c
  60.         @echo 3
  61.         @$(CC) $< -MM -MD -o $@
  62. # if the system-libs will always update, please ues this instead for
  63. #        $(CC) $< -M -o $@
  64. -include $(DEP_FILES)
  65. config: dir
  66. dir:
  67.         mkdir -p $(SRC_DIR)
  68.         mkdir -p $(OBJ_DIR)
  69.         mkdir -p $(LIB_DIR)
  70.         mkdir -p $(DEBUG_DIR)
  71.         mkdir -p $(RELEASE_DIR)
  72. clean:
  73.         rm -f $(OBJ_DIR)* *.d *.o
  74.         rm -f $(OUT)
  75.         clear
  76. rebuild: clean all
  77. cleanall:
  78.         rm -f $(OBJ_DIR)*
  79.         rm -f $(RELEASE_DIR)*
  80.         rm -f $(DEBUG_DIR)*
  81. test:
  82.         $(OUT)
  83. .PHONY: all config rebuild
  84. #.SUFFIXES:

复制代码

论坛徽章:
0
49 [报告]
发表于 2007-03-22 18:10 |只看该作者
48楼为最新更新

能够检查头文件的依赖关系了。

但是,没能将 .o  文件分离到单独的目录


原因在47楼

论坛徽章:
0
50 [报告]
发表于 2007-03-22 18:13 |只看该作者
如果大家还有什么良策妙极,欢迎讨论
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP