zoukankan      html  css  js  c++  java
  • linux中的make命令

    make命令的选项和参数:
    -k:它的作用是让make命令在发现错误时仍然继续执行,而不是在检测到第一个错误时就停下来。
    -n:它的作用是让make命令输出将要执行的操作步骤,而不真正执行这些操作
    -f :它的作用是告诉make命令将哪个文件作为makefile文件。如果未使用这个选项,标准版本的make
    命令将首先在当前目录下查找名为makefile的文件,如果该文件不存在,它就会查找名为Makefile的文件。
    但如果你是在linux系统中,你使用的可能是GNU Make,这个版本的make命令将在搜索makefile文件和
    Makefile文件之前,首先查找名为GNUmakefile的文件。

    1、依赖关系

    /*main.c*/
        #include "a.h"
    
        /*2.c*/
        #include "a.h"
        #include "b.h"
    
        /*3.c*/
        #include "b.h"
        #include "c.h"
    
        则我们可以在makefile中:
        myapp:  main.o 2.o 3.o
        main.o: main.c a.h
        2.o:    2.c a.h b.h
        3.o:    3.c b.h c.h
    这表示的是myapp依赖于main.o、2.o和3.o,而main.o依赖于main.c和a.h,等等
    如果想要一次创建多个文件,你可以使用all。
    all:myapp myapp.h
    如果未指定一个all目标,则make命令将只创建它在文件makefile中找到的第一个目标
    

    2、规则
    makefile文件的第二个是规则,它们定义了目标的创建方式。在上节的例字中,当make命令确定
    需要重建2.0时,它具体应该使用哪条命令呢?看上去只需使用命令gcc -c 2.c就够了,但是如果
    需要指定头文件目录,或者为了今后的调试需要设置符号信息选项又该怎么做呢?这就需要makefile
    文件中明确定义一些规则。

    一个简单的makefile文件:
        myapp: main.o 2.o 3.o
            gcc -o myapp main.o 2.o 3.o
        main.o: main.c a.h
            gcc -c main.c
        2.o: 2.c a.h b.h
            gcc -c 2.c
        3.o: 3.c b.h c.h
            gcc -c 3.c
        $ make -f Makefile1

    makefile文件中的宏:
    带宏定义的makefile文件

    all: myapp
    
        #which compiler
        CC = gcc
    
        #包含文件的位置在哪里 
        INCLUDE = .
    
        #发展选择
        CSLAGS = -g -Wall -ansi
    
        #释放选项
        #CFLAGS = -O -Wall -ansi
    
        myapp: main.c 2.o 3.o
            $(CC) -o myapp main.o 2.o 3.o
        2.o: 2.c a.h b.h
            $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
    
        3.o: 3.c b.h c.h
            #(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c
    内置宏的用法:
    宏           定义
    $?         当前目标所依赖的文件列表中比当前目标文件还要新的文件
    $@         当前目标的名字
    $<         当前依赖文件的名字
    $*         不包括后缀名的当前依赖文件的名字
    
    -:告诉make命令忽略所有错误
    @:告诉make在执行某条命令前不要将该命令显示在标准输出上
    

    多个目标:

    all: myapp
    
        #which compiler
        CC = gcc
    
        #where to install
        INSTDIR = /usr/local/bin
    
        #where are include files kept
        INCLUDE = .
    
        #options for development
        CFLAGS = -g -Wall -ansi
    
        #options for release 
        #CFLAGS = -O -Wall -ansi
        myapp: main.c 2.o 3.o
            $(CC) -o myapp main.o 2.o 3.o
    
        main.o: main.c a.h
            $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
    
        2.o: 2.c a.h b.h
            $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
    
        3.o: 3.c b.h c.h
            $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c
    
    
        clean:
            -rm main.o 2.o 3.o 
        install: myapp
            @if [ -d $(INSTDIR) ];
                then 
                ap myapp $(INSTDIR);
                chmod a+x $(INSTDIR)/myapp;
                chmod og-w $(INSTDIR)/myapp;
                echo "Installed in $(INSTDIR)";
            else 
                echo "Sorry,$(INSTDIR) does not exist";
            fi

    后缀和模式规则:
    下面时makefile文件的一个片段,它用一个新的通用规则将.cpp文件编译为.o文件;
    .SUFFIXES: .cpp
    .cpp.o:
    (CC)xc++(CFLAGS) -I(INCLUDE)c<

    用make’管理函数库:

    #Local Libraries
        MYLIB = mylib.a
    
        myapp: main.o $(MYLIB)
            $(CC) -o myapp main.o $(MYLIB)
    
        $(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)
        main.o:main.c a.h
        2.o: 2.c a.h b.h
        3.o: 3.c b.h c.h
    
        clean:
            -rm main.o 2.o 3.o $(MYLIB)
    技术不分国界
  • 相关阅读:
    python接口自动化基础框架结构 ——分层
    常见的布局实现,以及响应式布局技巧。
    google closure继承模块三:goog.base()源码分析
    google closure--继承模块二:goog.base()demo分析
    google closure--继承模块一:goog.inherits()
    项目中踩过的坑之-sessionStorage
    .NET/C#使用NPOI操作Excel
    WEB免费打印控件推荐
    Linux下部署ASP.NET项目
    Hibernate 查询方式(HQL/QBC/QBE)汇总
  • 原文地址:https://www.cnblogs.com/angels-yaoyao/p/12443604.html
Copyright © 2011-2022 走看看