Linux&&MAKE[了解]

MakeFile的定义

makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令.makele就像一个Shell脚本一样,其中也可以执行操作系统的命令。

一般来说,无论是C、C++、还是 pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

make命令执行时,需要一个 Makele 文件,以告诉make命令需要怎么样的去编译和链接程序。

makefile带来的好处就是–“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make.可见,makefile都成为了一种在工程方面的编译方法。

Make的书写规则

  1. 如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
  2. 1.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
  3. 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
  4. 在定义好依赖关系后,后续的那行定义了如何生成目标文件的操作系命令,一定要以一个Tab键作为开头(make并不管命令是怎么工作的,他只管执行所定义的命令。)。

Make如何工作

  1. make会在当前目录下找名字叫“Makele”或“makele”的文件;
  2. 如果找到,它会查找文件中的第一个目标文件.o;
  3. 如果文件不存在,它会根据依赖关系查找.s文件;
  4. 若.s文件不存在,make会在当前文件中查找.s文件的依赖文件.i;
  5. 若.i文件不存在,会根据依赖关系查找.c文件,当然.c文件是存在的,于是,make会生成一个.o文件,然后去执行文件。

这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即如果在我找了依赖关系之后,冒号后面的文件还是不在,那么make就不工作啦。

Make命令

make
根据Makefile文件编译源代码、连接、生成目标文件、可执行文件。
make clean
清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。
make install
将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。
make dist
产生发布软件包文件(即distribution package)。这个命令会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。
它会在当前目录下生成一个名字类似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.in中定义的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。
make distcheck
生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了。
make distclean
类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile文件。
make menuconfig
make menuconfig 是执行makefile里面的menuconfig目标. 如果后面 ARCH =arm CROSS_COMPILE=arm-linux- 的话表明: 编译出来的目标是针对ARM体系结构的。因为是针对ARM体系结构,所以需要使用交叉编译器。使用CROSS_COMPILE=xxx来指定交叉编译器。

CROSS_COMPILE=arm-linux- 意思是制定交叉编译器为arm-linux-XXX。 如:makefile里面会指定CC为arm-linux-gcc。

make -j
为了使make命令执行并行处理,-j 选项可以用来指定作业数。
用法:make -j4 或 make -jobs=4 //-j==-jobs ;多线程的意思
作业数是在编译的时候指定主机的CPU个数,所以在脚本中写成一个常量很糟糕。(特别是把编译脚本给其他人的时候。)并行处理的作业数和编译的效率直接相关,所以需要设置合适的作业数量。

脚本实现make的任务数能自动设置成CPU的数量

vim  linux/tools/perf/Makefile
    # Do a parallel build with multiple jobs, based on the number of CPUs 
    online 
    # in this system: 'make -j8' on a 8-CPU system, etc. 
    # (To override it, run 'make JOBS=1' and similar.) 
     
     ifeq ($(JOBS),)   
     JOBS := $(shell grep -c ^processor /proc/cpuinfo 2>/dev/null)   
         ifeq ($(JOBS),)     
             JOBS := 1   
         endif 
    endif 

这种计算了/proc/cpuinfo以processor开头的行的数量。
这里不使用wc命令来计算匹配的行数,而是用grep -c来获取。
这里JOBS是CPU的个数,用这个变量在子进程中使用make命令。

$(MAKE) -f Makefile.perf --no-print-directory -j$(JOBS) O=$(FULL_O) $(SET_DEBUG) $@

crosstool为xscale编译(ct-ng build)过程
ct-ng build.4 //意思是多线程去编译
make install -s //“-s”不输出详细log信息
make -f //”-f”指定特定的makefile文件,运行特定文件名的makefile文件

参考资料:
http://www.jb51.net/LINUXjishu/65444.html
http://blog.csdn.net/yu704645129/article/details/53169589

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值