Makefile

作者: k莫失莫忘 | 来源:发表于2019-07-25 09:41 被阅读0次

    1. 基本语法

    target ... : prerequisites ...
        command
        ...
    

    target 可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。对 于标签这种特性,在后续的“伪目标”章节中会有叙述。
    prerequisites 生成该target所依赖的文件和/或target
    command 该target要执行的命令(任意的shell命令)

    2. Make是如何工作的

    在默认的方式下,也就是我们只输入 make 命令。那么,

    1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
    2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个 文件,并把这个文件作为最终的目标文件。
    3. 如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比 edit 这个 文件新,那么,他就会执行后面所定义的命令来生成 edit 这个文件。
    4. 如果 edit 所依赖的 .o 文件也不存在,那么make会在当前文件中找目标为 .o 文件 的依赖性,如果找到则再根据那一个规则生成 .o 文件。(这有点像一个堆栈的过程)
    5. 当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生 成make的终极任务,也就是执行文件 edit 了。

    3. Makefile选项CFLAGS,LDFLAGS,LIBS

    原文链接

    标签 含义
    CFLAGSl 表示用于 C 编译器的选项 指定头文件(.h文件)的路径。如:CFLAGS=-I dir
    CXXFLAGS 表示用于 C++ 编译器的选项
    LDFLAGS 可以在里面指定库文件的位置 LDFLAGS=-Ldir1 -Ldir2
    LIBS 告诉链接器要链接哪些库文件 LIBS = -lpthread -liconv

    gcc编译器 CFLAGS 标志参数说明

    后缀名 所对应的语言
    -S 只是编译不汇编,生成汇编代码
    -E 只进行预编译,不做其他处理
    -g 在可执行程序中包含标准调试信息
    -o file 把输出文件输出到file里
    -v 打印出编译器内部编译各过程的命令行信息和编译器的版本
    -I dir 在头文件的搜索路径列表中添加dir目录
    -L dir 在库文件的搜索路径列表中添加dir目录
    -static 链接静态库
    -llibrary 连接名为library的库文件

    4. 在makefile中设置环境变量

    不知道 : )

    好吧,搜索了很久,没找到可行的方法,先挖个坑。
    因为程序中用到了getenv函数,所以固执地不用macro variable。
    目前的方法是手动修改
    如 $ export TMPFILE = tmp.txt

    5.最简单的makefile

    假设我只有一个main.c文件

    test: main.o
       gcc -o test main.o
    main.o: main.c
      gcc -c main.c
    clean:
      rm main.o test
    

    相关文章

      网友评论

          本文标题:Makefile

          本文链接:https://www.haomeiwen.com/subject/ntajmftx.html