zoukankan      html  css  js  c++  java
  • Linux Notes 01: makefile 写法

    1、写依赖关系

    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,然后写myapp的依赖关系,即它是依赖那些文件生成的,然后对于myapp依赖的这些文件,挨个照例写出他们的依赖。

          写法上注意,“:”紧贴在输出对象后面,冒号后面是一个空格,之后接着依赖的各项,用空格隔开。

          有个简单的办法,终端输入gcc -MM main.c 2.c 3.c,直接就得到了依赖关系,把结果拷进makefile里面就行了。

    2、明确创建规则

    makefile 创建规则
    myapp: main.o 2.c 3.c
        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

         简单地说,就是在前面写好的规则下面,加上一句,说明这个依赖关系是怎么实现的,如“gcc -o myapp main.o 2.o 3.o”,用gcc,将三个输出文件合并,得到最后的结果。

         这些创建规则,会在make的时候显示出来。

    3、宏

    makefile 宏
    CC=gcc
    myapp: main.o 2.c 3.c
        $(CC) -o myapp main.o 2.o 3.o
    main.o: main.c a.h
        $(CC) -c main.c
    2.o: 2.c a.h b.h
        $(CC) -c 2.c
    3.o: 3.c b.h c.h
        $(CC) -c 3.c
       

          makefile文件中的宏常用语设置编译器选项。我是新手,多的功能没见过,简单地说,就是把命令中本来写死的东西,用宏来包装,需要变更的时候,不用再makefile里面改,直接在运行make的时候改就可以了。如上面的makefile在运行的时候,可以这样“make CC=c89”,这样就改变了编译工具。

    4、多目标

          在makefile里面,不知可以写编译文件的东西,还有错其他的事情。比如make clean,make install。如下面例子所示。

    makefile 多目标
    all: myapp
    CC=gcc
    INSTDIR=/usr/local/bin
    INCLUDE=.
    CFLAGS=-g-Wall-ansi
    myapp: main.o a.o
        $(CC) -o myapp main.o a.o
    main.o: main.c main.h a.h
        $(CC) -I$(INCLUDE)$(CFLAGS) -c main.c
    a.o: a.c a.h
        $(CC) -I$(INCLUDE)$(CFLAGS) -c a.c 
    clean:
        -rm main.o a.o
    install: myapp
        if[ -d $(INSTDIR)];\
            then \
                cp myapp $(INSTDIR);\
                chmod a+X $(INSTDIR)/myapp;\
                chmod og-w $(INSTDIR)/myapp;\
                echo "Installed in $(INSTDIR)";\
        else
            echo "Sorry,$(INSTDIR) does not exit";\
        fi

           我比较无聊,又试了下别的,比如:

    makefile 多目标2
    all: myapp
    CC=gcc
    INSTDIR=/usr/local/bin
    INCLUDE=.
    CFLAGS=-g-Wall-ansi
    myapp: main.o a.o
        $(CC) -o myapp main.o a.o
    main.o: main.c main.h a.h
        $(CC) -I$(INCLUDE)$(CFLAGS) -c main.c
    a.o: a.c a.h
        $(CC) -I$(INCLUDE)$(CFLAGS) -c a.c 
    clean:
        -rm main.o a.o
    out:
        echo test

           在终端里面输入“make out”,输出了“test”。所以,我理解,makefile里面的clean、install,以及out,应该是类似于标签的一个东西,make+标签选择执行makefile中的一部分代码。

           初步先这样,凑活着能编译程序了,其他的不断积累。

  • 相关阅读:
    因打卡界面更新,稍修改主要代码【2021/1/16】
    Python爬虫:使用Selenium爬取指定上市公司(如浦发银行)的今年公告信息
    Python爬虫:爬取福州链家的不同区域的二手房成交信息
    蓝精灵小组第十三周学习总结
    2020-2021-1学期 20202417《网络空间安全专业导论》第十三周学习总结
    蓝精灵小组第十二周学习总结
    蓝精灵小组第十一周学习总结
    2020-2021-1学期 20202417《网络空间安全专业导论》第十二周学习总结
    2020-2021-1学期 20202417《网络空间安全专业导论》第十一周学习总结
    2020-2021-1学期 20202417《网络空间安全专业导论》第十周学习总结
  • 原文地址:https://www.cnblogs.com/YFYkuner/p/2219425.html
Copyright © 2011-2022 走看看