二、makefile(上)
01.make工具
  利用make工具可以自动完成编译工作。这些工作包括:如果修改了某几
个源文件,则只重装新编译这几个源文件;如果某个头文件被修改了,则
重新编译所有包含该头文件的源文件。利用这个自动编译可大大简化开发
工作,避免不必要的重新编译。
  make工具通过一个称为Makefile的文件来完成并自动维护编译工作。
Makefile文件描述了整个工程的编译、链接等规则。
02.Makefile的基本规则:
  TARGET...:DEPENDENCIES...
COMMAND
...
  目标(TARGET)程序产生的文件,如何执行文件和目标文件;目标也可
以是要执行的动作,如clean,也成为伪目标。
  依赖(DEPENDENCIES)是用来产生目标的输入文件列表,一个目标通常依
赖于多个文件。
  命令(command)是make执行的动作(命令是shell命令或是可在shell
下执行的程序)。注意:每个命令行的起始字符必须为TAB字符!
  如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,
这就是Makefile最核心的内容
#touch main.c add.c sub.c add.h sub.h
#ls
main.c add.c sub.c add.h sub.h
#vi main.c
int main()
{
return 0;
}
#vi Makefile
main:main.o add.o sub.o
gcc -Wall -g main.o add.o sub.o -o main
main.o:main.c
gcc -Wall -g -c main.c -o main.o
add.o:add.c add.h
gcc -Wall -g -c add.c -o add.o
sub.o:sub.c sub.h
gcc -Wall -g -c sub.c -o sub.o
#make(默认生成第一个目标)
#ls
main
#make(文件没有变化)
make:'main' id up to date
#touch sub.h(重新生成sub.h)
#make
gcc -Wall -g -c sub.c -o sub.o
gcc -Wall -g main.o add.o sub.o -o main
clean:(伪目标,并不是要生成的文件,用来删除这些文件)
rm -f main main.o add.o sub.o
#make clean
将链接文件全部删除
#make main.o
只生成main.o这个文件
.PHONY:clean(Makefile文件的最开头.表示clean是一个伪目标)
如果Makefile所在的文件夹下,存在clean文件,则执行make clean时会
提示:make:'clean'is up to date.
03.Makefile自动化变量
$@:规则的目标文件名
$<:规则的第一个依赖文件名
$^:规则的所有依赖文件列表
#vi Makefile.1
.PHONY:clean
OBJECTS=main.o add.o sub.o
main:$(OBJECTS)
gcc -Wall -g $^ -o $@
main.o:main.c
gcc -Wall -g -c $< -o $@
add.o:add.c add.h
gcc -Wall -g -c $< -o $@
sub.o:sub.c sub.h
gcc -Wall -g -c $< -o $@
clean:
@(加@不会打印在屏幕上)echo "begin delete..."(命令还是要
执行)
rm -f main $(OBJECTS)
#make
(正常工作)
#make clean
(正常工作)
#make clean -f Makefile.1
(以Makefile.1的规则来执行clean这个命令)
begin delete...
rm -f main main.o add.o sub.o
04.Makefile编译多个可执行文件
  模式规则:%.o:%.c
  后缀规则:.c.o
#mkdir 01
#mv *.c 01
#ls
#mv *.* 01
#ls
01 Makefile
#mv Makefile 01
#ls
#mkdir 02
#cd 02
#touch 01test.c 02test.c(01test.c,02test.c都要生成可执行文件)
#vi 01test.c 
int main(void)
{
return 0;
}
#vi02test.c
int main(void)
{
return 0;
}
#vi Makefile
.PHONY:clean
BIN=01test 02test
all:$(bin)
01test:01test.o
gcc -Wall -g  $^ -o $@
02test:02test.o
gcc -Wall -g  $^ -o $@
clean:
rm -f *.o $(BIN)
#make
01test 02test
#vi Makefile
BIN依赖两个文件
all这个目标依赖BIN两个文件
编译器自动将同名的"*.c"文件生成同名可执行文件
#make
cc 01test.c -o 01test
cc 02test.c -o 02test
#make clean
#ls
01test.c 02test.c Makefile
#make
cc -c -o 01test.o 01test.c
gcc -Wall -g -c 01test.o -o 01test
#make clean
#ls
01test.c 02test.c Makefile
#vi Makefile
%.o:%.c(将对应的.c文件生成.o文件)
gcc -Wall -g -c $< -o $@
#make clean
#make
#ls
#vi Makefile
CC=gcc
CFLAGS=-Wall -g
#%.o:%.c
# $(CC) $(CFLAGS) -c $< -o $@
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
01test:01test.o
$(CC) $(CFLAGS) $^ -o $@
02test:02test.o(将光标定位到这里,输入2yy,复制两行)
$(CC) $(CFLAGS) $^ -o $@
(点击p,复制到这里)
#make clean
#make
#ls
#vi 03test.c
int mian(void)
{
return 0;
}

Linux开发工具之Makefile(上)的更多相关文章

  1. Linux开发工具之Makefile(下)

    二.Makefile(下) 01.make常用内嵌函数 函数调用   $(function arguments) $(wildcard PATTERN)   当前目录下匹配模式的文件   例如:src ...

  2. Linux开发工具的使用

    1.   Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用 1.   Linux开发工具的使用 V ...

  3. Linux开发工具教程

    今天把上个星期写的Linux开发工具相关的教程整理一下,方便阅读: 1.第一课 GCC入门: 2.第二课 GCC入门之静态库以及共享库: 3.第三课 Makefile文件的制作(上) : 4.第四课 ...

  4. 基于AM3352/AM3354/AM3358/AM3359的Linux 开发环境搭建(上)

    遇到不少人新手小白问,前辈如何搭建一个优良的Linux 开发环境?之前一直都是在用win开发,现在想要尝试用Linux做开发等等一系列的问题.开源一直是给电子行业工作者提供了一种向技术更深处进发的机遇 ...

  5. Linux开发工具之gdb(上)

    三.gdb调试(上) 01.gdb:gdb是GNU debugger的缩写,是编程调试工作. 功能:   启动程序,可以按照用户自定义的要求随心所欲的运行程序:   可让被调试的程序在用户所指定的调试 ...

  6. Linux开发工具之gcc

    一.gcc入门(上)   1.gcc相关概念   gcc(GNU C Compiler)编译器,最初支持C语言,现已支持C.C++.Java.Pascal.Ada.COBOL语言等:支持多种硬件平台: ...

  7. 蜂鸟E203系列——Linux开发工具

    欲观原文,请君移步 Vivado安装 vivado是运行工程的工具,所以必须安装 后台回复[vivado2017]可获取vivado 2017.4 | 后台回复[vivado2020]可获取vitis ...

  8. Linux小工具:文件上传ftp服务器

    工作期间,每次将文件上传至ftp服务器时,均需要手工输入ip.用户名.密码等,因此,考虑编写脚本完成文件的上传任务.具体的脚本sync.sh如下: #!/bin/bash source ~/.bash ...

  9. Linux开发工具之gdb(下)

    三.gdb调试(下) 01.查看运行时数据 print - 查看变量值 ptype - 查看类型 print array - 查看数组 print *array@len - 查看动态内存 print ...

随机推荐

  1. EasyUI篇のDataGrid

    HTML: <table id="dg"></table> 或者 <div id="dg"></div> JS: ...

  2. java单点登录系统CAS的简单使用

    转:http://blog.csdn.net/yunye114105/article/details/7997041 背景 有几个相对独立的java的web应用系统, 各自有自己的登陆验证功能,用户在 ...

  3. Unity3D中的Coroutine详解

    Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutin ...

  4. html中混入的特殊字符

    从设计那里拿来的psd中常常会有全角的单双引号. 如果只是拷贝这些字符到做好的html里面,顶多看到乱码再加以改正. 但是,如果是通篇的doc,需要加上各种html语义标签,在拷贝来的doc文字之间加 ...

  5. STM32F10x 学习笔记6(USART实现串口通讯 2)

    这次讲讲利用串口收发中断来进行串口通讯.STM32 上为每个串口分配了一个中断.也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断.程序需在中断处理函数中读取状态寄存器(USART_SR) ...

  6. c# 循环语句练习题;

    1. 求100以内质数的和 2. 兔子问题 3. 九九乘法表:   一行一行打印: 4. 有一张超大的纸:   纸质的厚度是0.01:   对折多少次,可以达到珠峰的高度:   按照8848来计算: ...

  7. Strust2的json插件

    以下这段摘自网上: Json是一种轻量级的数据交换格式,JSon插件提供了一种名为json的ActionResultType .一旦为Action指定了该结果处理类型,JSON插件就会自动将Actio ...

  8. SendMessage和PostMessage区别以及WPARAM 和 LPARAM区别

    WPARAM 和 LPARAM wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数:一个是WORD类型的16位整型变量:另一个是LONG类型 ...

  9. HDU 5876 Sparse Graph 【补图最短路 BFS】(2016 ACM/ICPC Asia Regional Dalian Online)

    Sparse Graph Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

  10. sql server 2008有关SQL的模糊查询

    执行 数据库查询时,有完整查询和模糊查询之分. 一般模糊语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: 1,%:表示任意0个 ...