二、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 ...
随机推荐
- WPF学习笔记-TextBox光标位置如何放到最后?
TextBox光标位置如何放到最后? 使用SelectionStart : TextBox.SelectionStart = TextBox.Text.Length;
- bt种子文件文件结构
估计80%以上接触互联网的人都知道bt是什么东西,任何一个用bt下载的人都知道这样一个概念,种子.bt种子就是记录了p2p对等网络中tracker, nodes, files等信息,也就是说,这个 ...
- [151116 记录] 使用Python3.5爬取豆瓣电影Top250
这一段时间,一直在折腾Python爬虫.已有的文件记录显示,折腾爬虫大概个把月了吧.但是断断续续,一会儿鼓捣python.一会学习sql儿.一会调试OpenCV,结果什么都没学好.前几天,终于耐下心来 ...
- 关于set或map的key使用自定义类型的问题
我们都知道set或map的key使用自定义类型时必须重载<关系运算符 但是,还有一个条件,所调用重载的小于操作符,使用的对象必须是const 而对象调用的方法也必须是const的 1 #incl ...
- 一个用UpdateLayeredWindow实现窗体半透明的delphi的代码
http://www.pudn.com/downloads171/sourcecode/windows/detail791686.html unit Unit1; interface uses ...
- 【HDOJ】1247 Hat’s Words
字典树. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXN 50005 #d ...
- 数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司
1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 602 Solved: 214[Submit ...
- Android 安全测试
文章Android Security Tools对1~4的使用有介绍,下面主要分析其源码实现. 1.Manifest Explorer 2.Package Play Main.java public ...
- Validate Binary Search Tree——LeetCode
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
- 关于TCP的粘包和拆包
问题产生 一个完整的业务可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题. 下面可以看一张图,是客户端向服务端发送包: 1. 第一种情况 ...