linux make教程,Linux下makefile的一个简单框架
目录结构
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的一个简单框架相关推荐
- wireshark使用教程 linux,Linux入门教程:ubuntu下安装wireshark(以及配置非root),这个强大的工具可以捕...
Linux入门教程:ubuntu下安装wireshark(以及配置非root),这个强大的工具可以捕 Wireshark是世界上最流行的网络分析工具.这个强大的工具可以捕捉网络中的数据,并为用户提供关 ...
- Linux简易教程 Linux系统起源简介
Linux简易教程 Linux系统起源简介 balabalabala Linux⽤⼾和权限 linux是⼀个多任务,多⽤⼾系统.多⽤⼾就带来了权限的问题,⽂件和⽂件夹都有明确的所有者和相应的读写权 限 ...
- crf linux使用教程,Linux下CRF++的使用
在之前使用CRF++的过程中一直是再Windows下运行的,由于训练文本不大,所以很顺利,但为提高结果准确率而增加训练语料内容,随之也出现问题,因为用自己的机子做会使cpu占用率在训练迭代时瞬间达到1 ...
- 给linux系统增加rz功能,Linux系统教程_Linux下rz命令使用的详细实例
RZ和Linux的SZ命令命令可用于文件传输,和RZ命令用于上传文件,下面就举几个例子来介绍RZ指挥下详细使用Linux,一起分享学习linux系统教程的知识吧. RZ命令可以批量上传的文件,当然,你 ...
- linux删除del后缀文件,linux删除命令_linux下如何删除一个文件?
关于linux的删除命令 先登录linux服务器. linux下的删除命令是 del吗 不是del.是rm:remove 移除的意思.rm的用法如下: 1.删除文件夹以及文件夹中的所有文件命令: rm ...
- vnc 红帽linux安装教程,Linux(redhat\centos)下安装xrdp
标签: Linux下安装xrdp 使用rdp协议访问远程Linux桌面 一般情况下,如果需要登陆远程Linux系统,我们会使用ssh/telnet来完成,如果需要登陆到远程Linux系统的桌面环境,我 ...
- k3刷linux系统教程,Ubuntu 下使用K3B软件刻录光盘(图)
不知大家会不会在Ubuntu下刻录光盘呢?k3b是KDE环境下的一个CD/DVD刻录软件,有非常容易使用的界面,功能比较齐全.用起来感觉就象是win下的Nero一样简单自然,比ubuntu里原来的刻录 ...
- linux下glew例子,一个简单的GLSL Shader例子
本例子选自OpenGL Shading Language中的第一个Shader例子,使用颜色平滑地表示一个表面的温度.温度及其颜色的范围在应用程序中进行设置. //先看顶点着色器temp.vert: ...
- usb网络linux系统安装教程,Linux系统入门学习:如何在树莓派上安装USB网络摄像头...
Question: 我可以在树莓派上使用标准的USB网络摄像头么?我该如何检查USB网络摄像头与树莓派是否兼容?另外我该如何在树莓派上安装它? 如果你想在树莓上拍照或者录影,你可以安装树莓派的摄像头板 ...
最新文章
- Linux下通过进程名查看其占用端口
- 落纱机器人_「聚焦」青岛艾菲特智能落纱机器人—智能制造,为您省工
- webassembly_提升WebAssembly的安全性
- JS Location
- 【转】编辑器与IDE
- 排序算法之二 插入排序(C++版本)
- python 与 json
- html 折叠焦点图切换,自适应全屏焦点图切换CSS3特效
- dontshrink解决ProGuard错误:java.lang.StackOverflowError
- 查看计算机数字证书,数字证书认不到怎么办?
- Exadata是什么?
- win10局域网加入工作组计算机,Win10专业版加入局域网工作组的技巧
- 【硬件和驱动】如何查看linux的驱动有没有装好 ——声卡无声音,有驱动为例子,网卡wifi驱动相关
- 海词词典android v3.1.2新版发布 英语学习必备工具,海词词典手机版下载_海词词典最新版下载安装v6.1.18 - 数码资源网...
- win7电脑误删鼠标键盘驱动_鼠标键盘,教您怎么解决键盘和鼠标失灵的问题
- 固态硬盘计算机怎么自定义分区,固态硬盘分区,详细教您固态硬盘怎么分区
- nx531j android版本,努比亚Z11(NX531J)官方固件rom全量系统升级更新包:V2.92
- python中度数怎么表示_python中如何将华氏温度转换为摄氏温度?
- 什么是储蓄池抽样(Reservoir Sampling)算法?
- Visual C++编译错误:error C2220: 警告被视为错误 - 没有生成“object”文件
热门文章
- java udp 协议_网络协议 - UDP 协议详解
- matlab 读取照片imread,利用matlab读取图像
- java union pay 代码_Java标记了union / sum类型
- java - 判断任意一天是这年的第几天
- 【OpenCV 例程200篇】29. 图像的翻转(cv2.flip)
- win下python和opencv安装
- oracle dg snapshot,Oracle Broker Snapshot Standby测试
- access重复数据累计_小程序·云开发之数据库自动备份丨云开发101
- opencv14-自定义线性滤波
- 移动端iphone抓包调试神器—Stream安装和使用(一)