zoukankan      html  css  js  c++  java
  • makefile的写法

    makefile是一种描述依赖关系的文件, 它主要描述的是整个工程编译规则, 同时也给工程的维护提供很大的方便. 这在大型工程中非常实用. 在写好makefile之后, 只需要在命令行输入make命令, 工程就按照既定的makefile规则进行"自动化编译".

    1. 编译(compile)和链接(link):

    我们通常所说的编译一般来说指的是编译和链接这两个过程的总称.

    不管是什么类型的源文件(.c .cpp .pas .i...), 都需要先通过编译器中的编译单元生成目标文件(Object File), 它在Windows下是.obj文件, 在Linux下是.o文件, 这个过程叫作编译.

    然后编译器的链接单元把这些生成的目标文件合成为可执行文件, 这时链接单元只使用这些目标文件, 并不关心源代码, 这个过程叫作链接.

    在很多时候, 由于源文件的数目过于庞大, 编译后生成的目标文件数目也就很多, 在链接过程中由于需要指出所有目标文件, 这就显得很不方便, 于是我们可以把多个目标文件打个包.

    在Windows下管这种文件叫库文件(Library File), 扩展名为.lib;

    在Linux下这种文件叫Archive File, 扩展名为.a.

    可见.lib和.a都是编译的产物而非链接的产物.

    2. makefile:

    我们首先看一个简单的makefile:

    CC = g++
    OBJS 
    =
     main.o base.o derive.o
    EXEC 
    =
     test

    $(EXEC): $(OBJS)
            $(CC) -o $@ $^

    main.o: main.cpp base.h derive.h
            $(CC) -c $<

    base.o: base.cpp base.h
            $(CC) -c $<

    derive.o: derive.cpp derive.h base.h
            $(CC) -c $<

    clean:
            rm -rf $(EXEC) *.o

    这里需要说明几个概念: 变量, 目标, 依赖.

    变量: CC = g++, 这个CC就是一个在makefile里定义的变量, 在定义后可以使用, 使用时是$(CC).

    目标和依赖: main.o: main.cpp base.h derive.h, 这个":"(冒号)分开的两边中, 左边就是目标, 右边就是该目标的依赖, 而下一行的命令就是对应于这一对目标/依赖关系的. 当需要实现这个目标时, 如果依赖中有更新, 就需要执行下面的命令.

    比如, 当我们执行:

    make clean

    就会执行对应目标"clean"下的命令, 因为clean是没有依赖的, 所以这个命令总被执行.

    3. 隐含变量:

    在这个makefile文件中, 可以看到诸如$^ $< $@这样的东西, 这被我称为makefile的隐含变量.

    $^: 指的是当前依赖中的所有对象.

    $<: 指的是当前依赖中的第一个对象.

    $@: 指的是当前目标.

  • 相关阅读:
    C#listbox使用方法
    poj 3894 System Engineer (二分图最大匹配--匈牙利算法)
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 黑白无常
  • 原文地址:https://www.cnblogs.com/adylee/p/1334201.html
Copyright © 2011-2022 走看看