春节在家写的几个递进的make file,部分有点问题。接下来 有空我要把GNU make的手册看完。不然这方面太菜了。

GNU make手册

都需要make先设置环境变量BUILD_MODE为run或者debug

1 源文件名 目标都hard code,且一次编译多个目标

PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST))))

OBJS = lsdemo.o test.o

ifeq ($(BUILD_MODE),debug)
CFLAGS += -g
else ifeq ($(BUILD_MODE),run)
CFLAGS += -O2
else
$(error Build mode $(BUILD_MODE) not supported by this Makefile)
endif all: lsdemo test lsdemo: lsdemo.o
$(CXX) -o $@ $^ lsdemo.o: $(PROJECT_ROOT)/ch01/lsdemo.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< test: test.o
$(CXX) -o $@ $^ test.o: $(PROJECT_ROOT)/ch01/test.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< clean:
rm -fr lsdemo test $(OBJS)

2 通过OBJS变量定义多个目标文件 通过遍历ch01/目录下所有c文件作为源文件

PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST))))

OBJS = lsdemo.o test.o

ifeq ($(BUILD_MODE),debug)
CFLAGS += -g
else ifeq ($(BUILD_MODE),run)
CFLAGS += -O2
else
$(error Build mode $(BUILD_MODE) not supported by this Makefile)
endif all: lsdemo lsdemo: $(OBJS)
$(CXX) -o $@ $^ %.o: $(PROJECT_ROOT)/ch01/%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< #test: test.o
# $(CXX) -o $@ $^
#
#test.o: $(PROJECT_ROOT)/ch01/test.c
# $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
#
clean:
rm -fr lsdemo test $(OBJS)

3 ch01 ch02 多个子目录下多目标编译

PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST))))

CH01OBJS = lsdemo.o test.o
CH02OBJS = test21.o test22.o ifeq ($(BUILD_MODE),debug)
CFLAGS += -g
else ifeq ($(BUILD_MODE),run)
CFLAGS += -O2
else
$(error Build mode $(BUILD_MODE) not supported by this Makefile)
endif all: lsdemo ch02 lsdemo: $(CH01OBJS)
$(CXX) -o $@ $^ %.o: $(PROJECT_ROOT)/ch01/%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< ch02: $(CH02OBJS)
$(CXX) -o $@ $^ %.o: $(PROJECT_ROOT)/ch02/%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< #test: test.o
# $(CXX) -o $@ $^
#
#test.o: $(PROJECT_ROOT)/ch01/test.c
# $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
#
clean:
rm -fr lsdemo test $(OBJS)

4 通过修改CH_NO和APP_NAME切换到底编译哪个子目录下的应用,编译到指定路径下,适用于APUE学习时例程序编写

CH_NO = ch01
APP_NAME = lsdemo # 获取makefile路径
PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
$(info MAKEFILE_LIST is: $(MAKEFILE_LIST))
$(info PROJECT_ROOT is: $(PROJECT_ROOT)) # 拼接路径
SOURCE_FRAGMENT :=$(CH_NO)/$(APP_NAME)
SOURCE_ROOT := $(PROJECT_ROOT)$(SOURCE_FRAGMENT)
$(info SOURCE_ROOT is: $(SOURCE_ROOT))
BUILD_ROOT := $(PROJECT_ROOT)build/make.debug.linux.x86_64/$(SOURCE_FRAGMENT)/
$(info BUILD_ROOT is: $(BUILD_ROOT)) ifeq ($(BUILD_MODE),debug)
CFLAGS += -g
else ifeq ($(BUILD_MODE),run)
CFLAGS += -O2
else
$(error Build mode $(BUILD_MODE) not supported by this Makefile)
endif $(shell if [ ! -d $(BUILD_ROOT) ]; then mkdir -p $(BUILD_ROOT); fi;) SOURCE := $(shell find $(SOURCE_ROOT) -name '*.c' |xargs -n1 basename)
OBJS := $(SOURCE:.c=.o)
$(info SOURCE is: $(SOURCE))
$(info OBJS is: $(OBJS)) all: $(APP_NAME) #
$(APP_NAME): $(OBJS)
$(CXX) -o $(BUILD_ROOT)/$@ $(addprefix $(BUILD_ROOT), $^) %.o: $(SOURCE_ROOT)/%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $(BUILD_ROOT)/$@ $< clean:
rm -fr $(BUILD_ROOT)

附上第四种情况的目录结构:

appweb@simon-ububtu18-desk-2:~/600.self/03.code/01.cpp/03.APUE$ tree
.
├── build
│   └── make.debug.linux.x86_64
│   └── ch01
│   └── lsdemo
│   ├── lsdemo
│   ├── lsdemo.o
│   └── test.o
├── ch01
│   └── lsdemo
│   ├── lsdemo.c
│   └── test.c
└── Makefile

几个递进的make file的更多相关文章

  1. Py层次递进与文件修改大程序,模块,name与file

    层次的递进与返回 #输入quit的时候返回上一阶层,输入exit退出所有的循环 tag=True while tag==True: level1=input('level1:') if level1= ...

  2. JAVASE02-Unit06: 文件操作——File 、 文件操作—— RandomAccessFile

    Unit06: 文件操作--File . 文件操作-- RandomAccessFile java.io.FileFile的每一个实例是用来表示文件系统中的一个文件或目录 package day06; ...

  3. Hadoop化繁为简(二)—层层递进轻松入门hdfs

    层层递进-解开hdfs的面纱 1.hdfs是什么?它与普通服务器的文件系统有什么区别?它的特性有什么? 2.hdfs的工作原理是怎样的? 3.每台机器都单独启动有什么弊端?假设有1000台机器需要启动 ...

  4. CVE-2017-7494 Linux Samba named pipe file Open Vul Lead to DLL Execution

    catalogue . 漏洞复现 . 漏洞代码原理分析 . 漏洞利用前提 . 临时缓解 && 修复手段 1. 漏洞复现 . SMB登录上去 . 枚举共享目录,得到共享目录/文件列表,匿 ...

  5. [代码审计]四个实例递进php反序列化漏洞理解【转载】

    原作者:大方子 原文链接:https://blog.csdn.net/nzjdsds/article/details/82703639 0x01 索引 最近在总结php序列化相关的知识,看了好多前辈师 ...

  6. 记一个mvn奇怪错误: Archive for required library: 'D:/mvn/repos/junit/junit/3.8.1/junit-3.8.1.jar' in project 'xxx' cannot be read or is not a valid ZIP file

    我的maven 项目有一个红色感叹号, 而且Problems 存在 errors : Description Resource Path Location Type Archive for requi ...

  7. HTML中上传与读取图片或文件(input file)----在路上(25)

    input file相关知识简例 在此介绍的input file相关知识为: 上传照片及文件,其中包括单次上传.批量上传.删除照片.增加照片.读取图片.对上传的图片或文件的判断,比如限制图片的张数.限 ...

  8. logstash file输入,无输出原因与解决办法

    1.现象 很多同学在用logstash input 为file的时候,经常会出现如下问题:配置文件无误,logstash有时一直停留在等待输入的界面 2.解释 logstash作为日志分析的管道,在实 ...

  9. input[tyle="file"]样式修改及上传文件名显示

    默认的上传样式我们总觉得不太好看,根据需求总想改成和上下结构统一的风格…… 实现方法和思路: 1.在input元素外加a超链接标签 2.给a标签设置按钮样式 3.设置input[type='file' ...

随机推荐

  1. Zuul原理

    @EnableZuulProxy和@EnableZuulServer @EnableZuulProxy和@EnableZuulServer通过实例化不同的Marker,走不同的AutoConfigur ...

  2. 【原创】xenomai内核解析--同步互斥机制(一)--优先级倒置

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 目录 一.xenomai 资源管理简要 二.优先级倒 ...

  3. wpf文字模糊

    wpf如果使用了DropShadowEffect,会导致文字模糊,可以在window上设置 this.UseLayoutRounding = true;解决此问题

  4. WEB简单的登录注册功能(分层)

    登录: 前端页面: <body> <form action="/webtext/LogingServlet" method="post"> ...

  5. Python for循环使用 else 语句

    Python for循环使用 else 语句: else:当 for 所有的语句代码块正常运行完,才会运行 else 语句. 示例: ''' for 迭代对象 in 序列: 代码块(一行语句或多行代码 ...

  6. C++程序员容易走入性能优化误区!对此你怎么看呢?

    有些C++ 程序员,特别是只写C++ 没有写过 Python/PHP 等慢语言的程序员,容易对性能有心智负担,就像着了魔一样,每写3 行代码必有一行代码因为性能考虑而优化使得代码变形(复杂而晦涩). ...

  7. python之路第一节-pip的使用

    第一次写博客,一边吃着旺仔冻痴一边学着python,爽~ 我之理解pip 首先,python封装好了大量的函数,这些函数存在各种各样的库中. 那么怎么去向我们可爱的pycharm等软件导入这些库呢,两 ...

  8. Flask框架(二):路由与蓝图

    一.路由 使用 route() 装饰器来把函数绑定到 URL: @app.route('/') def index(): return 'Index Page' @app.route("/h ...

  9. 【Python】利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来

    源代码: """ 利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来 string_reverse_output():反向输出字符串的自定义函数 pending ...

  10. python7.1处理异常

    a=[21,32,43,0,32,"a"]for i in a:#取出元素 try:#写可能会报错的代码 print(3/i) except Exception as e:#捕获t ...