从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力。所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法。
    例说makefile分为以下几个部分,更多内容请参考【例说makefile索引博文】
    1.只有单个C文件  
    2.含有多个C文件   
    3.需要包括头文件路径
    4.增加宏定义
    5.增加系统共享库
    6.增加自定义共享库
    7.一个实际的例子

【代码仓库】——makefile-example
    代码仓库位于bitbucket,可借助TortoiseHg(GUI工具)克隆代码或者在网页中直接下载zip包。
    【本例说明】

本例将说明makefile文件中如何加入宏定义。

1.gcc复习
    宏定义使用前缀-D,在编译过程中可以把宏定义追加到CFLAG中。宏定义有两种相似的写法
    【第一种】-D DEFINES
    【第二种】-D DEFINES=CONDITION

2.源文件
    使用两种不同的方式,通过宏定义包裹打印功能,分别使用#ifdef和#if

#include <stdio.h>
#include <test-add.h>
#include <test-sub.h>
int main(void)
{
    int a = 3;
    int b = 2;
      
    printf("a=%d\n", a);
    printf("b=%d\n", b);
#ifdef TEST_ADD
    printf("a+b=%d\n", add(a,b));
#endif
#if TEST_SUB
    printf("a-b=%d\n", sub(a,b));
#endif
    return 0;
}

3.makefile
    请替换其中的[tab],并以代码仓库中的makefile文件为主。

# 指令编译器和选项
CC=gcc
CFLAGS=-Wall -std=gnu99
# 宏定义
DEFS = -DTEST_ADD -DTEST_SUB=1
CFLAGS += $(DEFS)
# 目标文件
   
TARGET=test
# 源文件
SRCS = test.c \
  ./test-add/test-add.c \
  ./test-sub/test-sub.c
# 头文件查找路径
INC = -I./test-add -I./test-sub
# 目标文件
OBJS = $(SRCS:.c=.o)
# 链接为可执行文件
$(TARGET):$(OBJS)
# @echo TARGET:$@
# @echo OBJECTS:$^
[tab]$(CC) -o $@ $^
clean:
[tab]rm -rf $(TARGET) $(OBJS)
# 连续动作,请清除再编译链接,最后执行
exec:clean $(TARGET)
[tab]@echo 开始执行
[tab]./$(TARGET)
[tab]@echo 执行结束
# 编译规则 $@代表目标文件 $< 代表第一个依赖文件
%.o:%.c
[tab]$(CC) $(CFLAGS) $(INC) -o $@ -c $<

4.具体说明

【1】 makefile定义头文件的方法有两种

【第一种】-D DEFINES

【第二种】-D DEFINES=CONDITION

【2】DEFS = -DTEST_ADD -DTEST_SUB=1
    为了说明问题,此处使用了两种不同的写法。此时两处打印功能均被执行

【3】CFLAGS += $(DEFS)
    追加到CFLAGS中,此处需要强调CFLAGS只是一个变量,可以命名为任何合法的名称,只要在编译过程中引用该参数即可。
    $(CC) $(CFLAGS) $(INC) -o $@ -c $<

5.执行过程
    【编译和链接】
    make clean && make
    【控制台输出】
rm -rf test test.o ./test-add/test-add.o ./test-sub/test-sub.o
gcc -Wall -std=gnu99 -DTEST_ADD -DTEST_SUB=1 -I./test-add -I./test-sub -o test.o -c test.c
gcc -Wall -std=gnu99 -DTEST_ADD -DTEST_SUB=1 -I./test-add -I./test-sub -o test-add/test-add.o -c test-add/test-add.c
gcc -Wall -std=gnu99 -DTEST_ADD -DTEST_SUB=1 -I./test-add -I./test-sub -o test-sub/test-sub.o -c test-sub/test-sub.c
gcc -o test test.o test-add/test-add.o test-sub/test-sub.o
    从控制台的输出可以看出,在编译过程中加入了-D参数。
    【执行】
a=3
b=2
a+b=5
a-b=1    最终效果和预期完全相同,makefile得到的验证。

6.总结
    【1】增加宏定义的两个方法 -D DEFINES  和 -D DEFINES=CONDITION
    【2】宏定义追加到CFLAG之后

Linux学习笔记——例说makefile 增加宏定义相关推荐

  1. linux添加自己的库,Linux学习笔记——例叙makefile 增加自定义共享库

    Linux学习笔记--例说makefile 增加自定义共享库 0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己 ...

  2. Linux学习笔记——例说makefile 综合案例

    0.前言 从学习C语言開始就慢慢開始接触makefile,查阅了非常多的makefile的资料但总感觉没有真正掌握makefile,假设自己动手写一个makefile总认为非常吃力.所以特意借助博客总 ...

  3. linux增量编译不成功,Linux学习笔记-增量编译(Makefile进一步使用)

    增量编译 在VC中就是增量编译! 当某个cpp更新后,只编译这个cpp文件,称为增量编译. 在Linux中,通过控制Makefile实现增量编译的效果 Makefile中使用"依赖depen ...

  4. Linux学习笔记-增量编译(Makefile进一步使用)

    增量编译 在VC中就是增量编译! 当某个cpp更新后,只编译这个cpp文件,称为增量编译. 在Linux中,通过控制Makefile实现增量编译的效果 Makefile中使用"依赖depen ...

  5. Linux学习笔记7

    Linux学习笔记7 Linux学习笔记7 创建用户更改的文件 查看磁盘或目录的容量 显示当前系统所有分区及磁盘 Virtualbox下扩展虚拟机磁盘容量 使用fdisk进行分区 格式化磁盘分区 挂载 ...

  6. Linux学习笔记5

    Linux学习笔记5 Linux学习笔记5 系统拥有哪些组 更改所属组 更改所属主 特殊权限 强制位set uid和set gid与冒险位sticky的作用都有什么 文件搜索 Linux的链接文件 系 ...

  7. Linux学习笔记---移植官方linux步骤(一)

    使用的开发板是正点原子IMX6U-MINI  EMMC512M的开发板,这个板子也是移植的NXP官方linux,所以这里就直接从NXP官方的linux移植. 这里所说的移植,其实不是自己编写驱动文件等 ...

  8. LINUX学习笔记:31个常用LINUX命令和相关解释

    LINUX学习笔记三: 最近在带新同事,是一个刚入行的萌新,对于linux不是很熟悉,问我怎么来学习. 所以今天接着之前的部分,继续分享一些linux学习资料.有需要的点点保存,没有跳过呗.PS:内容 ...

  9. 嵌入式linux学习笔记--TCP通讯整理

    嵌入式linux学习笔记–TCP通讯整理 之前的项目中使用到了比较多的tcp 通讯相关的知识,一直也没有进行整理,今天准备拿出时间好好的整理一下TCP通讯的整个过程.预计会整理linux和window ...

最新文章

  1. JAVA统计字母、数字个数
  2. 提升数据分析能力成熟度之四步曲_数据分析师
  3. Java Iterable类
  4. Linux常用命令(二)——超详版
  5. 集体智慧编程源代码(免费)
  6. 【Shell脚本学习7】Shell脚本学习指南分享
  7. elasticsearch 文档增删改
  8. 22讲MySQL有哪些“饮鸩止渴”提高性能的方法
  9. 计算机内存条如何区分频率,Win7怎么看内存条频率,教您查看方法
  10. 分组、分类(分组汇总)
  11. 为什么你的蓝牙耳机总是出毛病,不好好反思一下这些问题吗?
  12. 数字图像处理在前端页面中实现
  13. [Wi-Fi抓包篇]3. WireShark ——抓wlan口包的方法
  14. 读懂华为U8825Dupdater-script刷机脚本
  15. 计算机与代数---如何计算ln---方法和实现
  16. 路由协议OSPF和ISIS区别
  17. NY8A051E单片机
  18. Windows 7 启用、关闭休眠
  19. memcached搭建和使用要点
  20. 2022-2027年中国电压互感器行业发展监测及投资战略研究报告

热门文章

  1. Java的四种引用,强弱软虚,用到的场景(转+补充)
  2. Javascript重温OOP之原型与原型链
  3. WPF效果(GIS三维续篇)
  4. Linux 系统目录
  5. Nginx + php
  6. thinkphp5 内置接口开发与使用
  7. Java操作ftp,上传,下载,删除操作
  8. 学生信息管理系统中遇到的问题解析
  9. 手摸手,带你用vue撸后台 系列一(基础篇) - 掘金
  10. Java编写基于netty的RPC框架