zoukankan      html  css  js  c++  java
  • ubuntu:make工程管理器大致了解


    make工程管理器的作用

    通过读入makefile文件执行大量编译工作,可以:

    • 减少编译工作量
    • 提高效率

    makefile的基本结构

    • target
      目标体:目标文件或者可执行文件
    • dependency_file
      创造目标体所需的依赖文件
    • command
      创建每个目标体时所需要运行的命令
      基本格式为:
    target : dependency_files
    	command/*这行必须以Tab开头*/
    

    举例:

    hello.o:hello.c
    	gcc -c hello.c -o hello
    

    在命令行输入:

    make hello.o
    

    即可自动读入makefile文件,并执行对应target的command语句,并自动寻找依赖文件


    makefile变量

    变量是makefile中定义的名字,用来代替一个文本字符串,该文本字符串称为变量值,可代替目标体、依赖文件、命令、其他部分。
    变量的定义有两种方式: 递归展开式、简单方式
    递归展开方式的定义格式为: VAR = var,可以嵌套引用但是会出现无穷循环的情况比如:
    CFLAGS= $(CFLAGS) -O
    简单扩展方式为: VAR:=var,不能嵌套引用 。

    举例:下面是一个makefile文件

    david:kang.o yul.o
    	gcc kang.o yul.o -o myprog
    kang.o:kang.c kang.h head.h
    	gcc -Wall -O -g -c kang.c -o kang.o
    yul.o:yul.c head.h
    	gcc -Wall -O -g -c yul.c -o yul.o
    

    现在使用变量改写这个文件

    OBJS = kang.o yul.o
    CC = gcc
    CFLAGS = -Wall -O -g 
    david:$(OBJS)
    	$(CC) $(OBJS) -o david
    kang.o:kang.c kang.h head.h
    	$(CC) $(CFLAGS) -c kang.c -o kang.o
    yul.o:yul.c head.h
    	$(CC) $(CFLAGS) -c yul.c -o yul.o
    

    改写文件中的OBJS是用户的自定义变量,CCCFLAGS是预定义变量,常见的预定义变量有:

    • AR
      库文件维护程序的名称,默认值为ar
    • AS
      汇编程序的名称,默认值为as
    • CC
      C编译器的名称,默认值为cc
    • CPP
      C预编译器的名称,默认值为cc
    • CXX
      c++编译器的名称,默认值为g++
    • RM
      文件删除程序的名称,默认值为rm -f
    • ARFLAGS
      库文件维护程序选项,无默认值
    • ASFLAGS
      汇编程序的选项,无默认值
    • CFLAGS
      c编译器的选项,无默认值
    • CPPFLAGS
      c预编译器的选项,无默认值
    • CXXFLAGS
      c++编译器的选项,无默认值
    • FFLAGS
      Fortran编译器的选项,无默认值

    为了进一步简化makefile编写还引入了自动变量,可以代表目标文件和依赖文件,常见的自动变量有:

    • $*
      不含扩展名的目标文件名称
    • $+
      所有依赖文件以空格分开,以出现的先后为顺序
    • $<
      第一个依赖文件的名称
    • $?
      所有时间戳比目标文件晚的依赖文件
    • $@
      目标文件的完整名称
    • $^
      所有不重复的依赖文件
    • $%
      如果目标是归档成员,则表示归档成员的名称

    下面使用自动变量改写以下makefile文件

    david:kang.o yul.o
    	gcc kang.o yul.o -o myprog
    kang.o:kang.c kang.h head.h
    	gcc -Wall -O -g -c kang.c -o kang.o
    yul.o:yul.c head.h
    	gcc -Wall -O -g -c yul.c -o yul.o
    

    改写后:

    OBJS = kang.o yul.o
    CC = gcc
    CFLAGS = -Wall -O -g
    david:$(OBJS)
    	$(CC) $^ -o $@
    kang.o:kang.c kang.h head.h
    	gcc $(CFLAGS) -c $< -o $@
    yul.o:yul.c head.h
    	gcc $(CFLAGS) -c $< -o $@
    

    make管理器使用

    只需要在make命令后键入指定目标名,即可建立指定的目标,直接运行make则建立第一个目标

    常用的make命令行选项

    • -C dir
      读入指定目录下的makefile
    • -f file
      读入当前目录下的file文件作为makefile
    • -i
      忽略所有命令的执行错误
    • -I dir
      指定被包含的makefile所在目录
  • 相关阅读:
    http://www.cnblogs.com/zhengyun_ustc/p/55solution2.html
    http://www.cnblogs.com/carekee/articles/1854674.html
    http://www.blogjava.net/xylz/archive/2010/07/08/325587.html
    http://honda418.iteye.com/blog/337052/
    解决myeclipse每次启动注册码过期输入注册码
    JavaScript只能为汉字
    解决 不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接
    websphere变成英文了怎么变回中文
    【技术贴】解决MySql连接不上 ip远程连接Host is not allowed to conn
    【技术贴】解决bug mantisbt APPLICATION ERROR #1502 没有找到类别
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13860083.html
Copyright © 2011-2022 走看看