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_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
    当中第一种方法相应

    #ifdef

        do_something()
    #endif

    另外一种方法相应

    #ifndef DEFINES

        do_something()

    #endif
    【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学习笔记——举例说,makefile 多个文件

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

  2. Linux学习笔记——例说makefile 头文件查找路径

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

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

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

  4. Linux学习笔记——例说makefile 索引博文

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

  5. [转]Linux学习笔记——例说makefile 头文件查找路径

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

  6. C语言学习笔记--C语言中的宏定义

    1. C 语言中的宏定义 (1)#define 是预处理器处理的单元实体之一(因此,预处理器只是简单的进行替换,并不(2)#define 定义的宏可以出现在程序的任意位置(包括函数体的内部)(3)#d ...

  7. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  8. Linux 学习笔记之超详细基础linux命令 Part 3

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...

  9. linux —— 学习笔记(汇总)

    笔记目录:一.系统知识 和 基本概念                    二.常用操作                   三.系统管理(内存.设备.服务等管理)                   ...

随机推荐

  1. 微软中国裁员曝光:在CD结束后!薪酬不变!

    聚众抗议的前诺基亚员工(腾讯科技配图) 腾讯科技 郭晓峰 腾讯科技刚刚获取了一份微软设备事业部中国区管理团队4日晚间发给被裁员工的补偿方案邮件. 邮件内容显示,微软承诺在收购诺基亚交易结束(2014年 ...

  2. 基本介绍LINUX远程PC软件:PUTTY、SecureCRT、X-Manager

    ***********************************************声明************************************************ 原创 ...

  3. [LeetCode283]Move Zeros将一个数组中为0的元素移至数组末尾

    题目: Given an array nums, write a function to move all 0's to the end of it while maintaining the rel ...

  4. 大约SQL现场“这包括”与“包括在”字符串的写法

     1.字段查找表值"这包括"方法一字符串的所有记录 如果表中有一name场,查询name这包括"乔 - 史密斯"所有记录.能够写sql: Stirng st ...

  5. IBatis.Net获取执行的Sql语句

    前言 IBatis.Net中Sql语句是些在配置文件中的,而且配置文件是在程序启动时读取的(我们开发的时候需要将其设置成较新复制或者是始终复制),而不是程序将其包含在其中(例如NHibernate的映 ...

  6. 1!到n!的和

    Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 23  Solved: 14 [Submit][Status][Web Board] Descriptio ...

  7. MapReduce 规划 六系列 MultipleOutputs采用

    在前面的示例,输出文件名是默认: _logs part-r-00001 part-r-00003 part-r-00005 part-r-00007 part-r-00009 part-r-00011 ...

  8. ZipDemo

    package swing.zip; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt. ...

  9. 基于最简单的FFmpeg的AVDevice抽样(屏幕录制)

    =====================================================基于最简单的FFmpeg的AVDevice样品文章: 最简单的基于FFmpeg的AVDevic ...

  10. cocos2d-x使用CCClippingNode实现跑马灯

    直接在代码,这是一个很好的包layer,可以直接调用  //原来白白 bool TestLayer::init() { CCSize size = CCDirector::sharedDirector ...