1.前言

在目前的工作中,我遇到这样的一个工作情景,可以认为我要开发一个库,这个库的有多个模块,每个模块的.c放到src中,.h放到include中,这应该是个标准做法。

drwxr-xr-x.  root root  Mar  : include
drwxr-xr-x. root root Mar : obj
drwxr-xr-x. root root Mar : programs
drwxr-xr-x. root root Mar : src

然后希望产生的目标文件放到obj目录下。

因为我要对各个模块做多个测试,所以我有多个可执行文件,我把它们统一放到programs下面。

[root@localhost new_ttop]# ls programs/
config_test find_p list_test readfile second_test ttop

如上图,config_test是对src中的几个模块进行测试,而list_test又是对src的另外几个模块进行测试。

我应该写一个什么样的Makefile来面对这种情况呢?

我是这样解决的,首先在顶层目录,创建一个Make.include文件,文件内容如下:

DIR_INC = ../../include
DIR_SRC = ../../src
DIR_OBJ = ../../obj SRC = $(wildcard ${DIR_SRC}/*.c)
OBJ = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${SRC})) CC = gcc
CFLAGS = -g -Wall -std=gnu99 -lpthread -I${DIR_INC}
LFLAGS = -lpthread

然后在programs的子目录下,具体的程序中,再创建Makefile,下面是ttop的具体Makefile,对其他可执行文件来说,只需要改动BIN_TARGET

include ../../Make.include                    

BIN_TARGET = ttop
OBJ += $(BIN_TARGET).o ${BIN_TARGET}:$(OBJ)
$(CC) $(LFLAGS) $^ -o $@ %.o:%.c
$(CC) $(CFLAGS) -c $< -o $@ ${DIR_OBJ}/%.o:${DIR_SRC}/%.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY:clean
clean:
find ${DIR_OBJ} -name *.o |xargs rm -rf;
rm -f $(BIN_TARGET).o

最终,我的文件的布局如下图所示。

参考:

http://www.groad.net/bbs/read.php?tid-2920-page-e.html

http://blog.csdn.net/liangkaiming/article/details/6267357

http://blog.csdn.net/zqt520/article/details/7727051

http://www.cnblogs.com/Anker/p/3242207.html

多目录,多可执行文件的Makfile的编写的更多相关文章

  1. winform自动添加同级目录下可执行文件的快捷方式到右键菜单中

    /// <summary> /// 追加同目录下可执行文件到右键菜单中 /// 在form的Load事件中调用:new clsContextMenuStrip(this.FindForm( ...

  2. Makfile文件编写

    一.make是什么 GNU make是一个工程管理器,专门负责管理.维护较多文件的处理,实现自动化编译.如果一个工程项目中,有成百上千个代码源文件,若其中一个或多个文件进过修改,make就需要能够自动 ...

  3. Linux 下执行本目录的可执行文件(命令)为什么需要在文件名前加“./”

    一.PATH 是环境变量,里面保存了执行文件路径(通常会包含多个路径,各路径之间以冒号":"进行间隔).当执行一个可执行文件(命令)时,Linux 会优先到 PATH 环境变量中保 ...

  4. cmd项目目录结构以及配置文件的升级编写

    一.项目的目录结构: bin:执行文件夹 config:自定义配置文件 lib:公共的模块或者类文件 src:核心业务逻辑代码 二.配置文件的编写 1)config代码如下 from lib.conf ...

  5. nginx禁止访问目录中可执行文件

    某些网站系统需要用户上传图片等文件到某些目录下,难免程序有些漏洞,导致用户上传了php.cgi等等可执行的文件,导致网站陷入非常为难的境地. 此时我们可以通过nginx来禁止用户访问这些目录下的可执行 ...

  6. 单目录下多文件 makefile编写

    makefile很久就接触过了,但是一直没怎么深入的去学习和总结:在项目中我也只是看看makefile或者修改部分语句,全部自己动手写的话还真没有:知识在于沉淀,这句说的非常好,所以现在把自己理解的东 ...

  7. 多目录下多文件 makefile编写

    前面已经分享了单目录项下多文件的makefile的编写,现在来看看多目录下多文件makefile的编写: 在做项目时,一般文件都会分几个目录来存放:基本的是  include/  bin/ src/ ...

  8. Vs 2008 解决方案的目录结构设置和管理(转)

    http://blog.csdn.net/lcj_cjfykx/article/details/8632459 MS的这个IDE,实在庞杂得恐怖.从大学开始,我就一直用VC的各个版本写程序至今,细细想 ...

  9. 如何编写makefile

    一:Makefile介绍: Makefile是为自动化编译而生.我们写好makefile文件后,只需要一个make命令,就可以完成整个项目的编译工作,大大提高了开发效率. 也许刚开始学习编程时,你不会 ...

随机推荐

  1. salt 通信及其安全

    salt 通信及其安全 模型架构 server-agent通信模型: server就是salt master; agent就是salt-minion salt也可以作为一个单点服务器管理工具使用,或者 ...

  2. Hibernate---数据操作示例BY实体映射文件

    创建一个Student.java类:该类需要一个无参的构造函数,以及属性的get/set方法 public class Student implements Serializable { privat ...

  3. Java Spring Controller 获取请求参数的几种方法

    技术交流群:233513714  1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交.若"Content-Type"=& ...

  4. echarts 地图的背景色和各省颜色配置以及地图饼图联动

    myChart.on(ecConfig.EVENT.MAP_SELECTED, function (param) { var selected = param.selected; var str = ...

  5. 解决 ld: library not found for -lPods的问题

    现在打开有pods建好的workspace文件,尝试编译,会报ld: library not found for -lPods错误,原因就是工程里面的设置项覆盖了pods中xcconfig中的设置.解 ...

  6. Caliburn.Micro 消息附加多事件

    <Button Content="Let's Talk"cal:Message.Attach="[Event MouseEnter] = [Action Talk( ...

  7. 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  8. linux ubuntu开启sshd

    which ssh #查看文件 sudo apt-get install ssh #安装ssh cd /etc/init.d #切换目录 ls -l | grep ssh #执行启动脚本 sudo s ...

  9. day06_03 购物车讲解01

    1.0 思路 1.1 列表嵌套 # name1 = ['mac','book','bike','kindle'] a = [[1,2,3],'alex',(2,3,4)] print(a[0]) #& ...

  10. FluentAPI深入

    1.  HasMaxLenght 设定字段得最大长度: static void Main(string[] args) { using (TestDbContext ctx = new TestDbC ...