makefile初级基础

    xiaoxiao2023-03-24  2

    Makefile

    一般的设计工程都需要自己书写makefile,控制整个项目代码的编译。

    Makefile的核心思想:

    target : prerequestistus command 目标:依赖 操作系统执行的命令  

    命令列表中的每条命令必须以一个Tab开头,注意不能是空格,Makefile的格式不像C语言的缩进那么随意,对于Makefile中的每个以Tab开头的命令,make会创建一个Shell进程去执行它。

    如果在make的命令行中指定一个目标(例如clean),则更新这个目标,如果不指定目标则更新Makefile中第一条规则的目标(缺省目标)

     

    所有makefile内的语句,都是这样构成的。

    说明:只有在targetprerequisite旧,或者target不存在的时候,command才会被执行。

    而有些只是作为标签的功能,比如:installclean等;

    那么这样在执行make的时候,因为这些标签后面没有依赖,所以不会检查;

    只有在make后指定这些标签的时候,才会执行相应的command,比如:make clean命令,执行的将会是rm –rf bin命令一样。

    clean: rm–rf bin

    这种特性的好处是:可以写自己的标签,然后执行自己规定的命令(此时相当于嵌入了shell脚本)

     

    Makefile中的变量:

    (1)      为了方便对其中某些prerequisite的修改;

    (2)      增强代码的可读性和方便维护。

    引用变量时,使用$(var)的形式。

    .PHONY:clean clean: -rm–rf bin

    该标志表示clean是一个伪目标文件;

    而且这个语句是一般放在文件的最后的,说明要清空目标文件;

    在rm命令之前有“-”是说明若删除命令执行出错,可以忽略。

     

    执行make dist生成发布的源码包

    执行的操作:

    1)  将Makefile.am中的EXTRA_DIST文件打包到PACKAGE-VERSION.tar.gz中

     

    执行make命令时,是按照GNUmakefile、makefile、Makefile的顺序找到第一个存在的文件并执行它,不过还是建议使用Makefile做文件名

     

    如果一个目标在Makefile中的所有规则都没有命令列表,make会尝试在内建的隐含规则(Implicit Rule)数据库中查找适用的规则

    $@和$<是两个特殊的变量,

    $@的取值为规则中的目标

    $<的取值为规则中的第一个条件

    $?,表示规则中所有比目标新的条件,组成一个列表,以空格分隔

    $^,表示规则中的所有条件,组成一个列表,以空格分隔

     

    变量

    =运算符

    可以延迟赋值

    foo = $(bar) bar = test @echo $(foo)

    执行到第三句时,foo的值是$(bar),并没有展开

    := 运算符

    foo = $(bar) bar = test @echo $(foo)

    执行到第二句时,foo的值是””,立即展开了

     

    Make命令常用参数

    -n选项只打印要执行的命令,而不会真的执行命令

    Make -n

    -C选项可以切换到另一个目录执行那个目录下的Makefile

    Make –C src/ make CFLAGS=-g

    相关问题

    如何编写兼容gnu make 和BSD make的makefile?

    1、  首先要识别不同的平台

    2、  根据不同的平台配置不同的编译器(g++或clang++,个人觉得使用c++也是一个选项),不同的目标文件,不同的链接库等

    3、  执行程序编译

     

    选择方案:

    1、  使用automake(写configure.ac和makefile.am文件)

    2、  不同的平台写不同的Makefile文件(不推荐,修改代码后,可能要同时修改多个makefile)

    3、  Cmake

    最近看到ceph已经使用cmake代替autotools工具了,看了下cmake的方式,还是比较简单的

    https://cmake.org/cmake-tutorial/

    参考资料

    http://www.voidcn.com/blog/su_787910081/article/p-2797201.html

    http://sewm.pku.edu.cn/src/paradise/reference/CMake%20Practice.pdf

     

    widget: 查看.so库的接口

    使用命令nm librados.so 查看该so的symbol table

    转载请注明原文地址: https://ju.6miu.com/read-1200915.html
    最新回复(0)