Linux---make/makefile工具

目录

基本了解

makefile基础语法

依赖关系

依赖方法

makefile文件内容格式

make执行机制

补充知识

机制解释

PHONY关键字

makefile补充语法


基本了解

在Linux中,make/makefile是项目自动化构建工具。如果我们没有make/makefile,那我们要编译一个文件,只能使用gcc/g++指令来进行编译,但是我们有了make/makefile之后,就可以使用make指令来自动编译,不用输gcc/g++指令。尤其是多文件的时候,一个make指令直接搞定。

make是一个指令,makefile是一个文件。

makefile/Makefile文件名都可以,需要我们自己手动创建。

浅看一下

makefile基础语法

make指令只认makefile文件。

makefile文件里写的是依赖关系和依赖方法。

依赖关系

依赖关系是表明为什么,即确定一个关系的链接。

依赖方法

依赖方法是被依赖者应该怎么做,是解决问题的一种具体的方法。

makefile文件内容格式

使用make指令时,make默认时从上到下扫描makefile文件的,默认执行的是第一组依赖关系和依赖方法。

举个例子

但是,我们执行多次make指令时,会发现一个问题。

关于这个问题,是make/makefile执行机制的问题

make执行机制

补充知识

一般来说,一个文件/目录都是有它的ACM时间的。这里补充一点,Access Time不是根据每次访问时间来刷新的,而是根据某种规则刷新的。

具体原因如下:Linux在被使用的过程中,访问一个文件/目录的频率是比较高的,但是每次访问都修改Access Time有点浪费效率,所以,Linux就设置特殊规则来控制Access Time的刷新。

机制解释

 一个源文件(test.c文件)和可执行程序(mybin)的文件最经一次修改时间是不一致的。

即肯定需要先修改源文件,然后在编译链接形成对应的可执行程序。所以一定是先修改的源文件,再形成的可执行程序。

make指令可以可以通过比较可执行程序和源文件的最近一次修改时间(这里的时间是Modify Time)来确定是否需要再次执行指令。

为什么要这样做呢???

一般来说,源文件与可执行程序的时间先后分为两种:

1、可执行程序在前,源文件在后

 对于这种情况,源文件一定是做了修改的,是最新的,而可执行程序是旧的,还是上个源文件的版本形成的可执行程序。所以这种情况下的make指令,需要被执行。

2、源文件在前,可执行程序在后

 对于这种情况,可执行程序是新的,就是最新的源文件形成的可执行程序。所以此时make指令就不需要被执行,执行了也是白执行。

总结一下:make指令通过比较时间来知道可执行程序是新的还是旧的。可执行程序如果是新的,make指令就不执行。可执行程序如果是旧的,make就需要被执行。

注意:这里比较的时间是Modify Time,因为修改源文件一定修改的是源文件的内容。

但是,我们在已有指定文件的目录下,再去创建这个文件,就会刷新这个文件的ACM时间。

 这样的话,就又可以执行make指令了。

PHONY关键字

那么我如果就想make一个目标,并且要求这个目标每次都被执行,每次都不走make的机制,总不可能一直刷新ACM时间吧,这有点离谱哈哈哈。

所以,make/makefile为我们提供了一个关键字PHONY。

被PHONY修饰的目标称为伪目标,伪目标总是被执行。

一般将clean设置为伪目标。

原因在于如果将编译链接目标设置为伪目标的话,每次都需要重新编译链接,大大降低了编译效率,若按照make的机制,则可以节省性能资源和提高效率。

makefile补充语法

1、#表示注释,相当于C/C++中的//

2、$@表示目标文件

3、$^表示依赖文件

4、makefile再开始写的时候也可以定义变量,相当于一种宏替换。

最后,如有不足,请各位大佬多多指教!!!

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sudo make install Making install in libfcgi make[1]: Entering directory '/home/yk/fcgi-2.4.1-SNAP-0910052249/libfcgi' make[2]: Entering directory '/home/yk/fcgi-2.4.1-SNAP-0910052249/libfcgi' test -z "/home/yk/fcgi/lib" || mkdir -p -- "/home/yk/fcgi/lib" /bin/bash ../libtool --mode=install /usr/bin/install -c 'libfcgi.la' '/home/yk/fcgi/lib/libfcgi.la' /usr/bin/install -c .libs/libfcgi.so.0.0.0 /home/yk/fcgi/lib/libfcgi.so.0.0.0 (cd /home/yk/fcgi/lib && { ln -s -f libfcgi.so.0.0.0 libfcgi.so.0 || { rm -f libfcgi.so.0 && ln -s libfcgi.so.0.0.0 libfcgi.so.0; }; }) (cd /home/yk/fcgi/lib && { ln -s -f libfcgi.so.0.0.0 libfcgi.so || { rm -f libfcgi.so && ln -s libfcgi.so.0.0.0 libfcgi.so; }; }) /usr/bin/install -c .libs/libfcgi.lai /home/yk/fcgi/lib/libfcgi.la /usr/bin/install -c .libs/libfcgi.a /home/yk/fcgi/lib/libfcgi.a chmod 644 /home/yk/fcgi/lib/libfcgi.a arm-xilinx-linux-gnueabi-ranlib /home/yk/fcgi/lib/libfcgi.a ../libtool: line 6556: arm-xilinx-linux-gnueabi-ranlib: command not found /bin/bash ../libtool --mode=install /usr/bin/install -c 'libfcgi++.la' '/home/yk/fcgi/lib/libfcgi++.la' libtool: install: warning: relinking `libfcgi++.la' (cd /home/yk/fcgi-2.4.1-SNAP-0910052249/libfcgi; /bin/bash ../libtool --tag=CXX --mode=relink arm-xilinx-linux-gnueabi-g++ -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/home/yk/sdk/sysroots/cortexa9t2hf-neon-xilinx-linux-gnueabi -O2 -pipe -g -feliminate-unused-debug-types -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -o libfcgi++.la -lfcgi -rpath /home/yk/fcgi/lib fcgio.lo ) arm-xilinx-linux-gnueabi-g++ -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/home/yk/sdk/sysroots/cortexa9t2hf-neon-xilinx-linux-gnueabi -shared -nostdlib /home/yk/sdk/sysroots/cortexa9t2hf-neon-xilinx-linux-gnueabi/usr/lib/crti.o /home/yk/sdk/sysroots/cortexa9t2hf-neon-xilinx-linux-gnueabi/usr/lib/arm-xilinx-linux-gnueabi/8.2.0/crtbeginS.o .libs/fcgio.o -Wl,--rpath -Wl,/home/yk/fcgi/lib -L/home/yk/fcgi/lib -lfcgi -L/home/yk/sdk/sysroots/x86_64-petalinux-linux/usr/lib/arm-xilinx-linux-gnueabi/gcc/arm-xilinx-linux-gnueabi/8.2.0 -L/home/yk/sdk/sysroots/cortexa9t2hf-neon-xilinx-linux-gnueabi/lib -L/home/yk/sdk/sysroots/cortexa9t2hf-neon-xilinx-linux-gnueabi/usr/lib/arm-xilinx-linux-gnueabi/8.2.0 -L/home/yk/sdk/sysroots/cortexa9t2hf-neon-xilinx-linux-gnueabi/usr/lib -lstdc++ -lm -lc -lgcc_s /home/yk/sdk/sysroots/cortexa9t2hf-neon-xilinx-linux-gnueabi/usr/lib/arm-xilinx-linux-gnueabi/8.2.0/crtendS.o /home/yk/sdk/sysroots/cortexa9t2hf-neon-xilinx-linux-gnueabi/usr/lib/crtn.o -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9 -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-soname -Wl,libfcgi++.so.0 -o .libs/libfcgi++.so.0.0.0 ../libtool: line 4501: arm-xilinx-linux-gnueabi-g++: command not found libtool: install: error: relink `libfcgi++.la' with the above command before installing it Makefile:256: recipe for target 'install-libLTLIBRARIES' failed make[2]: *** [install-libLTLIBRARIES] Error 1 make[2]: Leaving directory '/home/yk/fcgi-2.4.1-SNAP-0910052249/libfcgi' Makefile:459: recipe for target 'install-am' failed make[1]: *** [install-am] Error 2 make[1]: Leaving directory '/home/yk/fcgi-2.4.1-SNAP-0910052249/libfcgi' Makefile:373: recipe for target 'install-recursive' failed make: *** [install-recursive] Error 1
07-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值