免费注册 查看新帖 |

Chinaunix

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

谁来指点我一下如何写个复杂点的Makefile。 [复制链接]

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-23 17:38 |只看该作者 |倒序浏览
30可用积分
我现在写的程序越来越大了,以前是把文件放在一个文件夹下面,然后写了一个简单的Makefile,

现在发现这个目录下面已经有30个文件了,并且我还要继续扩充其他功能,所以放在一个文件夹下面显然是不方便,

按照逻辑关系我把源代码分了一下类,分成了几个模块,每个模块建了一个文件夹,现在的目录结构大致如下:



  1. foo | Makefile
  2.     |
  3.     | README
  4.     |
  5.     | src | main.c
  6.     |     |
  7.     |     | module_01 | source_01.c
  8.     |     |           |
  9.     |     |           | source_02.c
  10.     |     |           |
  11.     |     |           | source_03.c
  12.     |     |           |
  13.     |     |           | source_04.c
  14.     |     |
  15.     |     | module_02 | source_01.c
  16.     |                 |
  17.     |                 | source_02.c
  18.     |                 |
  19.     |                 | source_03.c
  20.     |                 |
  21.     |                 | source_04.c
  22.     |
  23.     | include | header_01
  24.               |
  25.               | header_02

复制代码


其实分了几个个模块,上面只“画”了2个,未来还可能在模块内部增加子目录,

我只懂基本的make语法,谁能给点指导性的建议,或者给个类似开源项目,我上去照猫画虎一下,

我在看gnu make项目管理,还有一本徐海兵翻译的gnu make的文档,好像徐海兵翻译的看着比较容易,

我感觉可以使用“递归”来实现,就是在每个目录下面写一个Makefile,但是感觉好像不用“递归”也能实现,总之是一头糨糊啊。

最佳答案

查看完整内容

http://bbs.chinaunix.net/viewthread.php?tid=964590http://www.ibm.com/developerworks/cn/linux/l-makefile/

论坛徽章:
0
2 [报告]
发表于 2009-09-23 17:38 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2009-09-23 17:39 |只看该作者
可以参考一些实例。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2009-09-23 17:53 |只看该作者

回复 #1 fender0107401 的帖子


  1. ###########################################################################
  2. #                           _              
  3. #   ~Q~                    (_)            
  4. #                 ___ _   ___ __ __      __
  5. #                / __| | | | / __\ \ /\ / /
  6. #               | (__  |_| | \__ \\ V  V /
  7. #                \___|\__,_|_|___/ \_/\_/  
  8. #
  9. # Copyright (C) 2008 - 8002, Cui Shaowei, <[email]shaovie@gmail.com[/email]>, It's free.
  10. # This is a general makefile template.
  11. ###########################################################################

  12.                                BIN_DIR = ./bin
  13.                                 TARGET = $(BIN_DIR)/libnetdkit.so.1.0
  14.                               C_CFLAGS = -Wall -W -Wpointer-arith -pipe
  15.                                 MACROS = -D_REENTRANT -D__USE_POSIX -DNDK_RTLOG#-DNDK_STRACE
  16.                                     CC = gcc
  17.                             CPP_CFLAGS = -Wall -W -Wpointer-arith -pipe
  18.                                   MAKE = make
  19.                                 LINKER = g++
  20.                           INCLUDE_DIRS = -I .
  21.                                   LIBS = -lpthread
  22.                             OPTIM_FLAG = -O2
  23.                                    CPP = g++
  24.                                 LFLAGS = -Wl -shared -fPIC
  25.                               LIB_DIRS =
  26.                                  VPATH = ndk
  27.                             OBJECT_DIR = ./.obj/
  28.                               CPPFILES = \
  29.                                          acceptor.cpp  \
  30.                                          pipe.cpp  \
  31.                                          thread.cpp  \
  32.                                          strace.cpp  \
  33.                                          sock_connector.cpp  \
  34.                                          circular_buffer.cpp  \
  35.                                 CFILES = \
  36.                                          dictionary.c  \
  37.                                          iniparser.c

  38. # To use 'make debug=0' build release edition.
  39. ifdef debug
  40.     ifeq ("$(origin debug)", "command line")
  41.         IS_DEBUG = $(debug)
  42.     endif
  43. else
  44.     IS_DEBUG = 1
  45. endif
  46. ifndef IS_DEBUG
  47.     IS_DEBUG = 1
  48. endif
  49. ifeq ($(IS_DEBUG), 1)
  50.     OPTIM_FLAG += -g3
  51. endif

  52. # To use 'make quiet=1' all the build command will be hidden.
  53. # To use 'make quiet=0' all the build command will be displayed.
  54. ifdef quiet
  55.     ifeq ("$(origin quiet)", "command line")
  56.         QUIET = $(quiet)
  57.     endif
  58. endif
  59. ifeq ($(QUIET), 1)
  60.     Q = @
  61. else
  62.     Q =
  63. endif

  64. OBJECTS := $(addprefix $(OBJECT_DIR), $(notdir $(CPPFILES:%.cpp=%.o)))
  65. OBJECTS += $(addprefix $(OBJECT_DIR), $(notdir $(CFILES:%.c=%.o)))

  66. CALL_CFLAGS := $(C_CFLAGS) $(INCLUDE_DIRS) $(MACROS) $(OPTIM_FLAG)
  67. CPPALL_CFLAGS := $(CPP_CFLAGS) $(INCLUDE_DIRS) $(MACROS) $(OPTIM_FLAG)
  68. LFLAGS += $(LIB_DIRS) $(LIBS) $(OPTIM_FLAG)

  69. all: checkdir $(TARGET)

  70. $(TARGET): $(OBJECTS)
  71.     $(Q)$(LINKER) $(strip $(LFLAGS)) -o $@ $(OBJECTS)
  72.     @ln -sf $(notdir $(TARGET)) $(BIN_DIR)/libnetdkit.so

  73. $(OBJECT_DIR)%.o:%.cpp
  74.     $(Q)$(CPP) $(strip $(CPPALL_CFLAGS)) -c $< -o $@

  75. $(OBJECT_DIR)%.o:%.c
  76.     $(Q)$(CC) $(strip $(CALL_CFLAGS)) -c $< -o $@

  77. checkdir:
  78.     @if ! [ -d "$(BIN_DIR)" ]; then \
  79.         mkdir $(BIN_DIR) ; \
  80.         fi
  81.     @if ! [ -d "$(OBJECT_DIR)" ]; then \
  82.         mkdir $(OBJECT_DIR); \
  83.         fi
  84. clean:
  85.     rm -f $(OBJECTS)
  86. cleanall: clean
  87.     rm -f $(TARGET)

  88. .PHONY: all clean cleanall checkdir

复制代码


给你个模板,自己改一下

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2009-09-23 17:54 |只看该作者
cu 这个代码显式功能太差了,都变形了

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
6 [报告]
发表于 2009-09-23 18:34 |只看该作者
太感动了。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
7 [报告]
发表于 2009-09-23 21:13 |只看该作者
有点困惑,既然有了autoconf automake 这些工具,那么是不是就没有必要学习make了呢?

是不是比较大的项目(那种几百个文件的)都不用手工编写Makefile呢?

论坛徽章:
0
8 [报告]
发表于 2009-09-23 21:15 |只看该作者
  1. cd sub-dir && make
复制代码


命令结束后会自动返回当前目录

论坛徽章:
0
9 [报告]
发表于 2009-09-23 21:17 |只看该作者
automake也不错

但是如果不需要检测系统环境等,不推荐
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP