目录结构

tree

.

|-- Makefile

`-- src

|-- Makefile

|-- bar

| |-- Makefile

| `-- bar.c

`-- foo

|-- Makefile

`-- foo.c

3 directories, 6 files

顶层Makefile

# Makefile for top directory

# phony target

.PHONY: all debug release clean

#

all: release

#

debug:

$(MAKE) -C src debug

#

release:

$(MAKE) -C src release

#

clean:

$(MAKE) -C src clean

#EOF

src目录的Makefile

# Makefile for src directory

##############################

DIRS= foo \

bar

##############################

# phony target

.PHONY: all debug release clean

#

all:

set -e; for d in $(DIRS); do $(MAKE) -C $$d; done

#

debug:

set -e; for d in $(DIRS); do $(MAKE) DEBUG=1 -C $$d; done

#

release:

set -e; for d in $(DIRS); do $(MAKE) RELEASE=1 -C $$d; done

#

clean:

set -e; for d in $(DIRS); do $(MAKE) -C $$d clean; done

#EOF

bar目录的Makefile和bar.c

# Makefile for bar directory

##############################

TARGET=bar

SRCS=$(wildcard *.c)

OBJS=$(patsubst %.c,%.o,$(SRCS))

INCS=

ifeq ($(DEBUG),1)

CFLAGS=-Wall -DDEBUG

else

CFLAGS=-Wall -DRELEASE

endif

LDFLAGS=

LIBS=-lm

##############################

# phony target

.PHONY: all clean

#

all:$(TARGET)

# @echo "DEBUG="$(DEBUG)

# @echo "RELEASE="$(RELEASE)

# @echo "make " $(TARGET)

$(TARGET):$(OBJS)

# @echo $(OBJS)

$(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

$(OBJS):$(SRCS)

$(CC) $(CFLAGS) -c $< -o $@

#

clean:

@echo "make " $(TARGET) "clean"

rm -f $(TARGET) $(OBJS)

#EOF

#include

#include

int main(int argc, char *argv[])

{

#ifdef DEBUG

printf("debug begin\n");

#endif

const double pi = 3.1415926;

printf("sin(30*pi/180) is %f\n", sin(30*pi/180));

#ifdef DEBUG

printf("debug end\n");

#endif

return 0;

}

foo目录的Makefile和foo.c

# Makefile for foo directory

##############################

TARGET=foo

SRCS=$(wildcard *.c)

OBJS=$(patsubst %.c,%.o,$(SRCS))

INCS=

ifeq ($(DEBUG),1)

CFLAGS=-Wall -DDEBUG

else

CFLAGS=-Wall -DRELEASE

endif

LDFLAGS=

LIBS=-lm -lpthread

##############################

# phony target

.PHONY: all clean

#

all:$(TARGET)

# @echo "DEBUG="$(DEBUG)

# @echo "RELEASE="$(RELEASE)

# @echo "make " $(TARGET)

$(TARGET):$(OBJS)

# @echo $(OBJS)

$(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

$(OBJS):$(SRCS)

$(CC) $(CFLAGS) -c $< -o $@

#

clean:

@echo "make " $(TARGET) "clean"

rm -f $(TARGET) $(OBJS)

#EOF

#include

#include

#include

#include

void *fun(void *arg)

{

pthread_detach(pthread_self());

#ifdef DEBUG

printf("pthread debug begin\n");

#endif

const double pi = 3.1415926;

printf("sin(30*pi/180) is %f\n", sin(30*pi/180));

#ifdef DEBUG

printf("pthread debug end\n");

#endif

return NULL;

}

int main(int argc, char *argv[])

{

int ret;

pthread_t tid;

ret = pthread_create(&tid, NULL, fun, NULL);

sleep(1);

return 0;

}

bar目录make debug的结果

debug begin

sin(30*pi/180) is 0.500000

debug end

foo目录make debug的结果

pthread debug begin

sin(30*pi/180) is 0.500000

pthread debug end

linux make教程,Linux下makefile的一个简单框架相关推荐

  1. wireshark使用教程 linux,Linux入门教程:ubuntu下安装wireshark(以及配置非root),这个强大的工具可以捕...

    Linux入门教程:ubuntu下安装wireshark(以及配置非root),这个强大的工具可以捕 Wireshark是世界上最流行的网络分析工具.这个强大的工具可以捕捉网络中的数据,并为用户提供关 ...

  2. Linux简易教程 Linux系统起源简介

    Linux简易教程 Linux系统起源简介 balabalabala Linux⽤⼾和权限 linux是⼀个多任务,多⽤⼾系统.多⽤⼾就带来了权限的问题,⽂件和⽂件夹都有明确的所有者和相应的读写权 限 ...

  3. crf linux使用教程,Linux下CRF++的使用

    在之前使用CRF++的过程中一直是再Windows下运行的,由于训练文本不大,所以很顺利,但为提高结果准确率而增加训练语料内容,随之也出现问题,因为用自己的机子做会使cpu占用率在训练迭代时瞬间达到1 ...

  4. 给linux系统增加rz功能,Linux系统教程_Linux下rz命令使用的详细实例

    RZ和Linux的SZ命令命令可用于文件传输,和RZ命令用于上传文件,下面就举几个例子来介绍RZ指挥下详细使用Linux,一起分享学习linux系统教程的知识吧. RZ命令可以批量上传的文件,当然,你 ...

  5. linux删除del后缀文件,linux删除命令_linux下如何删除一个文件?

    关于linux的删除命令 先登录linux服务器. linux下的删除命令是 del吗 不是del.是rm:remove 移除的意思.rm的用法如下: 1.删除文件夹以及文件夹中的所有文件命令: rm ...

  6. vnc 红帽linux安装教程,Linux(redhat\centos)下安装xrdp

    标签: Linux下安装xrdp 使用rdp协议访问远程Linux桌面 一般情况下,如果需要登陆远程Linux系统,我们会使用ssh/telnet来完成,如果需要登陆到远程Linux系统的桌面环境,我 ...

  7. k3刷linux系统教程,Ubuntu 下使用K3B软件刻录光盘(图)

    不知大家会不会在Ubuntu下刻录光盘呢?k3b是KDE环境下的一个CD/DVD刻录软件,有非常容易使用的界面,功能比较齐全.用起来感觉就象是win下的Nero一样简单自然,比ubuntu里原来的刻录 ...

  8. linux下glew例子,一个简单的GLSL Shader例子

    本例子选自OpenGL Shading Language中的第一个Shader例子,使用颜色平滑地表示一个表面的温度.温度及其颜色的范围在应用程序中进行设置. //先看顶点着色器temp.vert: ...

  9. usb网络linux系统安装教程,Linux系统入门学习:如何在树莓派上安装USB网络摄像头...

    Question: 我可以在树莓派上使用标准的USB网络摄像头么?我该如何检查USB网络摄像头与树莓派是否兼容?另外我该如何在树莓派上安装它? 如果你想在树莓上拍照或者录影,你可以安装树莓派的摄像头板 ...

最新文章

  1. Linux下通过进程名查看其占用端口
  2. 落纱机器人_「聚焦」青岛艾菲特智能落纱机器人—智能制造,为您省工
  3. webassembly_提升WebAssembly的安全性
  4. JS Location
  5. 【转】编辑器与IDE
  6. 排序算法之二 插入排序(C++版本)
  7. python 与 json
  8. html 折叠焦点图切换,自适应全屏焦点图切换CSS3特效
  9. dontshrink解决ProGuard错误:java.lang.StackOverflowError
  10. 查看计算机数字证书,数字证书认不到怎么办?
  11. Exadata是什么?
  12. win10局域网加入工作组计算机,Win10专业版加入局域网工作组的技巧
  13. 【硬件和驱动】如何查看linux的驱动有没有装好 ——声卡无声音,有驱动为例子,网卡wifi驱动相关
  14. 海词词典android v3.1.2新版发布 英语学习必备工具,海词词典手机版下载_海词词典最新版下载安装v6.1.18 - 数码资源网...
  15. win7电脑误删鼠标键盘驱动_鼠标键盘,教您怎么解决键盘和鼠标失灵的问题
  16. 固态硬盘计算机怎么自定义分区,固态硬盘分区,详细教您固态硬盘怎么分区
  17. nx531j android版本,努比亚Z11(NX531J)官方固件rom全量系统升级更新包:V2.92
  18. python中度数怎么表示_python中如何将华氏温度转换为摄氏温度?
  19. 什么是储蓄池抽样(Reservoir Sampling)算法?
  20. Visual C++编译错误:error C2220: 警告被视为错误 - 没有生成“object”文件

热门文章

  1. java udp 协议_网络协议 - UDP 协议详解
  2. matlab 读取照片imread,利用matlab读取图像
  3. java union pay 代码_Java标记了union / sum类型
  4. java - 判断任意一天是这年的第几天
  5. 【OpenCV 例程200篇】29. 图像的翻转(cv2.flip)
  6. win下python和opencv安装
  7. oracle dg snapshot,Oracle Broker Snapshot Standby测试
  8. access重复数据累计_小程序·云开发之数据库自动备份丨云开发101
  9. opencv14-自定义线性滤波
  10. 移动端iphone抓包调试神器—Stream安装和使用(一)