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包。
 
1.三个C文件和三个头文件
    此处的例子稍微复杂些但更接近实际情况。
    文件结果如下:根目录中包含test.c makefileh和文件夹test-add和文件夹test-sub。
test.c makefile
    【test-add】test-add.c test-add.h
    【test-sub】test-sub.c test-sub.h
 
    【test.c】
  1. #include <stdio.h>
  2. #include <test-add.h>
  3. #include <test-sub.h>
  4. int main(void)
  5. {
  6. int a = 3;
  7. int b = 2;
  8. printf("a=%d\n", a);
  9. printf("b=%d\n", b);
  10. printf("a+b=%d\n", add(a,b));
  11. printf("a-b=%d\n", sub(a,b));
  12. return 0;
  13. }
    【test-add.c】
  1. #include <test-add.h>
  2. int add(int a, int b)
  3. {
  4. return a+b;
  5. }
    【test-add.h】
  1. #ifndef __TEST_ADD
  2. int add(int a, int b);
  3. #endif
    【test-sub.c】
  1. #include "test-sub.h"
  2. int sub(int a, int b)
  3. {
  4. return a-b;
  5. }
    【test-sub.h】
  1. #ifndef __TEST_SUB
  2. int sub(int a, int b);
  3. #endif
 
2.复习gcc指令
    gcc指令可通过-I前缀指定头文件路径,特别说明./代表当前路径,../代表上一级目录。
 
3.编写makefile
    请替换其中的[tab],并以代码仓库中的makefile文件为主。
  1. # 指令编译器和选项
  2. CC=gcc
  3. CFLAGS=-Wall -std=gnu99
  4. # 目标文件
  5. TARGET=test
  6. SRCS = test.c \
  7. ./test-add/test-add.c \
  8. ./test-sub/test-sub.c
  9. INC = -I./test-add -I./test-sub
  10. OBJS = $(SRCS:.c=.o)
  11. $(TARGET):$(OBJS)
  12. #   @echo TARGET:$@
  13. #   @echo OBJECTS:$^
  14. [tab]$(CC) -o $@ $^
  15. clean:
  16. [tab]rm -rf $(TARGET) $(OBJS)
  17. %.o:%.c
  18. [tab]$(CC) $(CFLAGS) $(INC) -o $@ -c $<
    【具体说明】
    【1】相比于单个文件和多个文件的makefile,通过变量INC制定了头文件路径。头文件路径之间通过空格隔开。
    【2】编译规则%.o:%.c中加入了头文件参数$(CC) $(CFLAGS) $(INC) -o $@ -c $<,那么在编译的过程中便会出现
    gcc -Wall -std=gnu99 -I./test-add -I./test-sub -o test.o -c test.c。和单个文件和多个文件的makefile相比增加了头文件路径参数。
    【3】SRCS变量中,文件较多时可通过“\”符号续行。
 
    【编译】
    make clean && make
    【控制台输出】
rm -rf test test.o ./test-add/test-add.o ./test-sub/test-sub.o
gcc -Wall -std=gnu99 -I./test-add -I./test-sub -o test.o -c test.c
gcc -Wall -std=gnu99 -I./test-add -I./test-sub -o test-add/test-add.o -c test-add/test-add.c
gcc -Wall -std=gnu99 -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
    从控制台的输出可以看出,通过make clean清除上一次的可执行文件和目标文件,然后依次编译各个C文件,在编译的过程中制定了头文件路径,最后把3个目标文件链接为最终可执行文件。

[转]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学习笔记14——使用fcntl实现文件锁定

    期末考试快要来了,Linux学习进度一下拉下来许多.今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf.下面主要是fcntl的调用. fcntl函数的原型是:in ...

  5. Linux学习笔记:scp远程拷贝文件

    scp是secure copy的简写,用于Linux下进行远程拷贝文件的命令,类似的有cp,不过cp仅在本机上进行拷贝不能跨服务器. 命令格式: scp [参数] [原路径] [目标路径] -q 不显 ...

  6. Linux学习总结(十五)文件查找 which whereis locate find

    which命令 用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录.which指令会在环境变量$PATH设置的目录里查找符合条件的文件.也就是说,使用which命令,就 ...

  7. Linux学习笔记:mv移动或文件重命名

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 语法:mv 源文件 目标文件 视mv命令中 ...

  8. Linux学习笔记(一):文件操作命令

    命令 含义 cd / 切换到根目录 cd .. 上级目录 cd ./bin 到同级的bin目录中 cd bin 到同级的bin目录中 cd - usr文件夹 cd ~ 回到root用户的主文件夹 pw ...

  9. Linux学习笔记之scp远程拷贝文件

    0x00 拷贝本机/home/administrator/test整个目录至远程主机192.168.1.100的/root目录下 代码如下: scp -r /home/administrator/te ...

随机推荐

  1. JVM内存管理------垃圾搜集器参数精解

    本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...

  2. Python:如何删除文件中的空白行?

    def delblankline(infile,outfile): infopen = open(infile,'r') outfopen = open(outfile,'w') lines = in ...

  3. Struts2与Struts1的区别

    Struts2是基于WebWork的一个全新框架.不过有了Struts1的基础,学Struts2更方便.Struts2主要改进是取代了Struts1的Servlet和Action.Struts2的核心 ...

  4. 【数据采集】VBA数据采集可用 COM 组件

    windows 中提供了4个COM组件都可以进行数据采集. Wininet WinHttp XmlHttp MSHTML https://msdn.microsoft.com/en-us/librar ...

  5. 在db2数据库上模拟死锁场景 还是z上的

    如果条件允许,起两个线程互相抢资源就行了,但问题是,时间上还需要同步,要做到完美控制,还得加其他逻辑,忒费事,所以可以用下面的办法: 在目标表上直接加个锁……简单,粗暴,直接……很好…… LOCK T ...

  6. Power BI for Office 365(八)共享查询

    在Power Query中,你不但可以搜索线上的数据,也可以把自己的数据发布到线上供其它人检索.Power Query通过Power BI站点提供了这种内置的分享功能.在Excel中,Anna打开了她 ...

  7. shell腳本

    1.awk过滤重复行 awk '!a[$0]++{print $0}' 过滤重复行 awk '!a[$1]++{print $1}' 过滤第一列重复行 并只打印第一列 awk '!($1 in a){ ...

  8. 移动端使用让图片或者div垂直居中

    ._limgMIiddle{ /* Firefox */ display:-moz-box; -moz-box-pack:center; -moz-box-align:center; /* Safar ...

  9. 转--脉络清晰的BP神经网络讲解,赞

    http://www.cnblogs.com/wengzilin/archive/2013/04/24/3041019.html 学 习是神经网络一种最重要也最令人注目的特点.在神经网络的发展进程中, ...

  10. PullToRefresh

    PullToRefreshListView的使用,实现下拉刷新,上拉加载更多.首先是布局文件: <com.handmark.pulltorefresh.library.PullToRefresh ...