zoukankan      html  css  js  c++  java
  • make 学习体会(一)

    在对makefile进行了部分学习后,感觉到还是多看看简短的例子比较好。

    发现下面这个网站讲得很好:

    http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/

    hellomake.c:

    #include 
    int main() {
      // call a function in another file
      myPrintHelloMake();
    
      return(0);
    }

    hellofunc.c:

    #include 
    #include 
    
    void myPrintHelloMake(void) {
      printf("Hello makefiles!\n");
      return;
    }

    hellomake.h:

    /*
    example include file
    */
    void myPrintHelloMake(void);

    第一个 makefile的例子:

    hellomake: hellomake.c hellofunc.c
         gcc -o hellomake hellomake.c hellofunc.c -I.

    hellomake 是规则名;它的前提条件是:hellomake.c 和 hellofunc.c。

    在此规则中,我们要执行的片段是: gcc -o hellomake hellomake.c hellofunc.c -I

    第二个 makefile的例子:

    CC=gcc
    CFLAGS=-I.
    
    hellomake: hellomake.o hellofunc.o
         $(CC) -o hellomake hellomake.o hellofunc.o -I.

    此处定义了 变量 cc 和 CFLAGS , 这也是很多 makefile中很常见的两个变量。

    此时,规则 hellomake 依赖于两个目标文件 hellomake.o 和 hellofunc.o ,

    而且这里有一个隐含的依赖关系:

    hellomake.o 来自于对 hellomake.c 的编译

    hellofunc.o 来自于 对 hellofunc.c 的编译

    由于为了生成 hellomake,需要 hellomake.o 和 hellofunc.o ,

    就意味着实际上需要 hellomake.c 和 hellofunc.c。

    $(CC) 就代表了 gcc 命令,此处实际上还尚未使用 CFLAGS 变量。

    第三个 makefile例子:

    CC=gcc
    CFLAGS=-I.
    DEPS = hellomake.h
    
    %.o: %.c $(DEPS)
        $(CC) -c -o $@ $< $(CFLAGS)
    
    hellomake: hellomake.o hellofunc.o 
        gcc -o hellomake hellomake.o hellofunc.o -I.

    %.o: 规则表明:每一个 .o 文件,都是依赖于 同名的 .c 文件,和 DEPS 所定义的头文件。

    具体为了生成此 .o 文件,需要进行编译动作:

    $(CC) -c -o $@ $< $(CFLAGS)

    其中 $(CC) 和 -c -o 都不用解释了。

    $@表示的就是 冒号左边的内容,即某个.o 文件。

    $<表示的就是 冒号右边的第一个参数,即此同名的.c 文件。

    $(CFLAGS) 在这里就是 -I。

    第四个 makefile例子:

    CC=gcc
    CFLAGS=-I.
    DEPS = hellomake.h
    OBJ = hellomake.o hellofunc.o 
    
    %.o: %.c $(DEPS)
        $(CC) -c -o $@ $< $(CFLAGS)
    
    hellomake: $(OBJ)
        gcc -o $@ $^ $(CFLAGS)

    同上个例子相比,它又定义两个 OBJ变量。

    hellomake 依赖于 OBJ变量所指代的目标文件,

    gcc -o $@ $^ $(CFLAGS) 中,其他的都不用再解释了。

    $^ 是冒号右边的值,这里就是 $(OBJ),也就是 hellomake.o, hellofunc.o。

    第五个 makefile例子:

    IDIR =../include
    CC=gcc
    CFLAGS=-I$(IDIR)
    
    ODIR=obj
    LDIR =../lib
    
    LIBS=-lm
    
    _DEPS = hellomake.h
    DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
    
    _OBJ = hellomake.o hellofunc.o 
    OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
    
    
    $(ODIR)/%.o: %.c $(DEPS)
        $(CC) -c -o $@ $< $(CFLAGS)
    
    hellomake: $(OBJ)
        gcc -o $@ $^ $(CFLAGS) $(LIBS)
    
    .PHONY: clean
    
    clean:
        rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 

    这里面 IDIR,LDIR,ODIR 分别指定了 头文件/库文件/输出目标文件的目录。

    来看这一句:

    DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
    patsubst 是一个 函数,它会把所有 % 所代表的文件字符串,改变为 头文件目录下的 文件字符串。

    第三个参数 $(_DEPS)指明了这个 函数的作用范围。

    OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) 的作法与此类似。

    其他的,也没有什么可以说的了,但是 这里有一个伪规则 clean。它是没有前提条件的。

    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 中,

    *~ , 我猜测代表的是 所有没有扩展名的文件。core 指代的是程序出错时生成的 core 文件。

  • 相关阅读:
    Linux 下如何查看一个组内的有哪些用户
    Linux下查看用户列表
    用pureftpd+pureDB虚拟用户,建立一个简单安全(不需要数据库支持)的linux ftp站
    pure-ftp中如何设置匿名帐号,自定义匿名帐号访问指定目录
    PUTTY中永久更改字体大小
    Pure-ftpd 如何配置多用户,且A用户具有上传下载权限,B用户只有下载权限?
    windows10访问ftp中文乱码怎么办?
    WPF DynamicDataDisplay.dll 下载
    C# windows presentation foundation 项目中不支持Application
    c# NDP472-KB4054530-x86-x64-AllOS-CHS下载
  • 原文地址:https://www.cnblogs.com/gaojian/p/2688165.html
Copyright © 2011-2022 走看看