二、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(下)
二.Makefile(下) 01.make常用内嵌函数 函数调用 $(function arguments) $(wildcard PATTERN) 当前目录下匹配模式的文件 例如:src ...
- Linux开发工具的使用
1. Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用 1. Linux开发工具的使用 V ...
- Linux开发工具教程
今天把上个星期写的Linux开发工具相关的教程整理一下,方便阅读: 1.第一课 GCC入门: 2.第二课 GCC入门之静态库以及共享库: 3.第三课 Makefile文件的制作(上) : 4.第四课 ...
- 基于AM3352/AM3354/AM3358/AM3359的Linux 开发环境搭建(上)
遇到不少人新手小白问,前辈如何搭建一个优良的Linux 开发环境?之前一直都是在用win开发,现在想要尝试用Linux做开发等等一系列的问题.开源一直是给电子行业工作者提供了一种向技术更深处进发的机遇 ...
- Linux开发工具之gdb(上)
三.gdb调试(上) 01.gdb:gdb是GNU debugger的缩写,是编程调试工作. 功能: 启动程序,可以按照用户自定义的要求随心所欲的运行程序: 可让被调试的程序在用户所指定的调试 ...
- Linux开发工具之gcc
一.gcc入门(上) 1.gcc相关概念 gcc(GNU C Compiler)编译器,最初支持C语言,现已支持C.C++.Java.Pascal.Ada.COBOL语言等:支持多种硬件平台: ...
- 蜂鸟E203系列——Linux开发工具
欲观原文,请君移步 Vivado安装 vivado是运行工程的工具,所以必须安装 后台回复[vivado2017]可获取vivado 2017.4 | 后台回复[vivado2020]可获取vitis ...
- Linux小工具:文件上传ftp服务器
工作期间,每次将文件上传至ftp服务器时,均需要手工输入ip.用户名.密码等,因此,考虑编写脚本完成文件的上传任务.具体的脚本sync.sh如下: #!/bin/bash source ~/.bash ...
- Linux开发工具之gdb(下)
三.gdb调试(下) 01.查看运行时数据 print - 查看变量值 ptype - 查看类型 print array - 查看数组 print *array@len - 查看动态内存 print ...
随机推荐
- sphinx 简介以及安装 以及php拓展开启
一 sphinx 简介 在 使用mysql数据库过程中,如果想实现全文检索的优化,可以使用mysql自带全文索引,但是不支持中文..关于sphinx的安装网上很多教程写的都 不错比如:http:/ ...
- C#中调用WIN32的API
最近在学习C#中的GDI部分,本来尝试编写一个字幕控件(其实还是用label比较合适),但是发现控件中用GDI将整个控件粉刷貌似不行(应该是我水平不行),所以就去捣鼓了下WIN32的DLL,发现用AP ...
- Idea设置自动导包
默认 IntelliJ IDEA 是没有开启自动 import 包的功能. 勾选标注 1 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们优化导入的包,比如自动去掉一些没有用到的包 ...
- MySql可视化工具MySQL Workbench使用教程
1. MySQL Workbench MySQL Workbench 为数据库管理员.程序开发者和系统规划师提供可视化的Sql开发.数据库建模.以及数据库管理功能. 2.MySQL Workbench ...
- [POJ 2774] Long Long Message 【后缀数组】
题目链接:POJ - 2774 题目分析 题目要求求出两个字符串的最长公共子串,使用后缀数组求解会十分容易. 将两个字符串用特殊字符隔开再连接到一起,求出后缀数组. 可以看出,最长公共子串就是两个字符 ...
- Jersey Politics
poj2454:http://poj.org/problem?id=2454 题意:给你3*k个数,然后让你分成三堆,使得至少其中的两堆中的数字之和大于500*k.题解:这道题一开始我并不知道怎么做, ...
- Unity 随机数的使用
脚本语言:C# 一个比较常用的例子是游戏中的主角碰到场景中的NPC时,NPC会随机做出反应,例如有50%几率来友好的致敬,25%几率走开,20%几率反身攻击和%%的几率赠送礼物. 创建一个NPCTes ...
- bzoj3668
noi水题,直接推出来每一位上取什么值才能取1直接搞就可以了 ..] of longint; x,n,i,j,k,t,m,ans:longint; fl:boolean; s:string; ch:c ...
- 【转】Android JNI编程—JNI基础
原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...
- 图论:(Code Forces) Graph and String
Graph and String time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...