0.前言

从学习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_ADDprintf("a+b=%d\n", add(a,b));
#endif
#if TEST_SUBprintf("a-b=%d\n", sub(a,b));
#endifreturn 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. Makefile:宏定义EXTRA_CFLAGS += -D 与CONFIG_ =y

    makefile宏定义:EXTRA_CFLAGS += -D 与CONFIG_ =y EXTRA_CFLAGS += -D 与CONFIG_ =y 1. 假如定义一个宏CONFIG_DEBUG 在.c ...

  2. linux gcc 宏定义 __GNUC__ __GNUC_MINOR__ 版本区分

    今天在看Linux系统编程这本书的代码的时候看到了__GNUC__,不太清楚这个宏所以去查了一下,以此记录.GNU C预定义了一系列的宏,这些宏都是以双下划线开始的,这里只讲一下__GNUC__  _ ...

  3. linux arm64 宏定义,ARM64 芯片的 Jiffies 更新流程

    最近在调试 arm64 机器时遇到了一个比较蛋疼的时钟问题,这个时钟问题会导致在部分机器类型上导致无法启动,为了深入了解并解决掉这个问题,特定决定研究一下整个 jiffies 的更新逻辑过程,本篇文章 ...

  4. linux c 宏定义 #define _GNU_SOURCE 含义

    今天我必须要使用 basename 函数,使用man手册查询了一下这个函数 man 3 basename 发现一个奇怪的信息 名称 basename,dirname-分析路径名组件 简介 #inclu ...

  5. Linux如何查看信号宏定义,转  LINUX 调试宏定义

    在include\linux下新建一个debug头文件debug_if.h,鉴于KERN_WARNING之类的宏 在include\linux\kernel.h,因此将debug_if.h包含到ker ...

  6. linux shell 宏定义_Linux系统和Shell命令行简介,走上数据分析之路

    122Linux系统和Shell命令行简介,走上数据分析之路 本节作者:刘永鑫 中国科学院遗传与发育生物学研究所 版本1.0.2,更新日期:2020年8月31日 本项目永久地址:https://git ...

  7. linux shell 宏定义_linux内核修炼之系统调用

    fork()这个系统调用是有两个返回值的,在子进程中的返回值是0,在父进程中的返回值是PID,如下 图 fork一次 返回两次 关于0x80中断和特权级检查 在mian函数的sched_init()函 ...

  8. linux shell 宏定义_一篇教会你写90%的shell脚本

    shell是外壳的意思,就是操作系统的外壳.我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls.cd.pwd等等.总结来说,Shell是一个命令解释器,它通过接 ...

  9. 【Android NDK 开发】JNI 方法解析 ( JNIEXPORT 与 JNICALL 宏定义作用 )

    文章目录 I . JNIEXPORT 与 JNICALL 宏定义 II . JNIEXPORT 与 JNICALL 宏定义说明 ( Windows 平台 ) III . JNIEXPORT 与 JNI ...

最新文章

  1. [转]ToolTip在VC中的使用
  2. 用百度开放地图api在代码中获得两地距离
  3. windows 7 睡眠和休眠的区别
  4. 410. Split Array Largest Sum 分割数组的最大值
  5. C语言试题八十五之狼追兔子问题
  6. 安卓倒计时 listview默认选中一项
  7. Docker、Kubernetes与PaaS不得不说的渊源
  8. Spark:通过start-slaves.sh脚本启动worker报错:Permission denied
  9. 11.25晚C语言答疑
  10. 立潮头 筑根基 赢未来——ZDNS合作伙伴大会成功举办
  11. Avalondock 第二步 创建文档面板
  12. Revit二次开发——选集
  13. c语言输入字符输出数字,C语言——输入一个字符串,将连续数字字符转换为数字...
  14. GoLang的安装和使用
  15. 建造者模式——画胖小人和瘦小人
  16. 怎么对文件夹进行随机重命名?怎么批量给多个文件夹生成随机名称?
  17. I/O复用 —— select
  18. win10如何开启自带的虚拟机?
  19. php kestrel,转载 kestrel php 讯息队列
  20. Jlink V9刷入自动升级固件

热门文章

  1. Linux Kernel TCP/IP Stack — L7 Layer — Application Socket I/O 接口类型
  2. Python 进阶_函数式编程
  3. Openstack Nova 源码分析 — RPC 远程调用过程
  4. 深度:应用安全是信息安全防护的短板
  5. 《HttpClient官方文档》2.1 连接持久性-2.2 HTTP连接路由
  6. delete archivelog all 无法彻底删除归档日志?
  7. jQuery中attr和prop方法的区别
  8. discuz 修改积分策略( 在周期中添加每周 )
  9. Vitamio FAQ(2012-11-20 )
  10. ubuntu修改根用户密码