[转帖]gcc与makefile常用操作(绝对常用,也绝对够用)
makefile与gcc常用操作
一、温故知新
1、可执行程序的生成过程

2、gcc的常用操作
gcc/g++ 命令的基本格式为
gcc -[选项] [文件名]
例如:
gcc -c -I /home/inc/ test.c -o test.o
gcc -I /home/inc/ -O2 -g3 main.c test.o -o main

二、make操作
make 的基本格式为:
make -[选项] [文件名]
例如:
make -v
make -n
make -C /home/erc/ -f Makefile02 -s

三、编写Makefile文件时常用操作
下面会着重介绍编写Makefile文件时经常用到的操作,对于makef的执行规则等更细致全面的知识可以参考Makefile教程(绝对经典,所有问题看这一篇足够了)
注意:在Makefile文件中 空格和缩进是完全不同的,不可以相互转换。
1、框架格式
目标1:依赖
命令
目标2:依赖
命令
目标3:依赖
命令
2、举例
假如说我现在有这么一个程序需要编译:
所需的 .h 头文件在 /home/inc/ 目录下
所需的 .c 源文件在 /home/src/ 目录下
#include "myadd.h"
#include "mysub.h"
主函数在当前目录下的 main.c 里
int main()
{
return 0;
}
那么Makefile文件应该这么编写
main:/home/inc/myadd.o /home/inc/mysub.o ./main.o
gcc -I /home/inc/ /home/inc/myadd.o /home/inc/mysub.o ./main.o -o main
/home/inc/myadd.o:/home/src/myadd.c
gcc -c -I /home/inc/ /home/src/myadd.c -o /home/src/myadd.o
/home/inc/mysub.o:/home/src/mysub.c
gcc -c -I /home/inc/ /home/src/mysub.c -o /home/src/mysub.o
./main.o:./main.c
gcc -c -I /home/inc/ ./main.c -o ./main.o
clean:
rm -rf /home/inc/mysub.o /home/inc/myadd.o ./main.o main
3、优化
以下是优化后的代码
NAME=main
SRC=\((</span>wildcard ./*.c<span class="token variable">)</span></span> <span class="token variable"><span class="token variable">\)(wildcard /home/src/*.c)
OBJ=\((</span>patsubst %.c, %.o, <span class="token punctuation">\)(SRC))
INC=-I"/home/inc/"
\((</span>NAME<span class="token variable">)</span></span><span class="token builtin class-name">:</span><span class="token variable"><span class="token variable">\)(OBJ)
@ \((</span>CC<span class="token variable">)</span></span> <span class="token parameter variable">-g</span> <span class="token variable"><span class="token variable">\)(INC) \((</span>OBJ<span class="token variable">)</span></span> <span class="token parameter variable">-o</span> <span class="token variable"><span class="token variable">\)(NAME)
%.o:%.c
@ \((</span>CC<span class="token variable">)</span></span> <span class="token parameter variable">-c</span> <span class="token variable"><span class="token variable">\)(INC) \(^ <span class="token parameter variable">-o</span> <span class="token variable">\)@
.PHONY:clean
clean:
@ rm -f \((</span>OBJ<span class="token variable">)</span></span> <span class="token variable"><span class="token variable">\)(NAME)
1). 伪目标 .PHONY
声明目标成伪目标之后,make会无条件执行该目标,
且不会判断目标是否存在或者是否需要更新。
例如:常常把 clean声明为伪目标
.PHONY:clean
clean:
<span class="token function">rm</span> <span class="token parameter variable">-rf</span> <span class="token variable"><span class="token variable">$(</span>OBJ<span class="token variable">)</span></span> <span class="token variable"><span class="token variable">$(</span>NAME<span class="token variable">)</span></span>
2). $ 和 @ 符号的作用
@ :运行命令时,隐藏命令
例如:@ rm -f $(OBJ) $(NAME) 会删除这些文件,但终端上不会有rm -r 输出
$ :使用变量,(定义变量的时候不需要加$)
例如 echo $(NAME)
3). 变量
注意:
不管是自定义变量或者是系统变量,使用方法都一样
使用方法即: $(变量名称)
变量的工作原理和 C语言中的 define类似,是会直接替换的,
所以一定要处理好空格。
变量种类
自定义变量:
定义: NAME=main
使用: echo $(NAME)
系统常量:
优点:与设备无关,全平台通用,使 makefile 可以跨平台。
常见系统常量:
Makefile 中常见系统变量:
(加 星号 的是使用频率较高的)
4). 匹配模式
目标前缀名和依赖前缀名相同时,可以使用匹配模式缩减代码长度
例如:
myadd.o : myadd.c 可以被替换为
%.o : %.c
$(wildcard /home/src/*.c)
获取某目录下的所有.c文件名称
$(patsubst %.c, %.o, $(SRC))
获取某些 .c 文件对应的 .o 文件
使用方法
获取当前目录下的所有 .c 文件的全名,获取 /home/src/目录下的所有 .c 文件的全名
并把文件名储存到 SRC 变量里
SRC=$(wildcard ./*.c) $(wildcard /home/src/*.c)
获取SRC变量里的 .c 文件对应的 .o 文件的全名
并把文件名储存到 OBJ 变量里
OBJ=\((</span>patsubst %.c, %.o, <span class="token punctuation">\)(SRC))
此时再回头看优化代码,OvO,原来是这样。
4、Makefile中的条件判断 ifeq ifdef
使用:
ifeq 判断两个变量是否相等
括号里是要判断的两个变量
A=aa
TMP:=
ifeq ($(A),aa)
TMP1:=aa
else
TMP1:=no-aa
endif
ifdef 判断某变量是否定义且赋值(如果没有赋值也是false)
B=
TMP2:=
ifdef (B)
TMP2:=def-B
else
TMP2:=ndef-B
endif
注意事项:
注意书写格式,ifeq 或者 ifdef 和括号之间有一个空格!!!
Makefile中不存在 elif 但可以嵌套调用 ifeq 或 ifdef 来实现elif的功能
5、Makefile中的循环 foreach
语法
命令 $(foreach v, 集合, 对v进行重命名或拼接等)
例子
TARGET=t1 t2 t3 t4
all:
mkdir \((</span>foreach v, <span class="token punctuation">\)(TARGET), $v_dir)
说明:
遍历TARGET变量,然后在每个变量名后面拼接_dir组成新的名称,
然后以新的名称创建目录
演示结果:
6、Makefile中的赋值 = 和 :=
= 是最终赋值,
:= 是临时赋值,
实际上 := 类似 C++中的变量引用,
对于 = 和 := 具体的区别,大家可以自己动手实操感受下。
总结
纸上谈来终觉浅,绝知此事要躬行!
[转帖]gcc与makefile常用操作(绝对常用,也绝对够用)的更多相关文章
- centos LAMP第四部分mysql操作 忘记root密码 skip-innodb 配置慢查询日志 mysql常用操作 mysql常用操作 mysql备份与恢复 第二十二节课
centos LAMP第四部分mysql操作 忘记root密码 skip-innodb 配置慢查询日志 mysql常用操作 mysql常用操作 mysql备份与恢复 第二十二节课 mysq ...
- JavaScript常用操作,常用类
算术运算符 重点关注 算数,赋值,逻辑运算符,三目运算符 <!DOCTYPE html> <html> <head> <meta charset=" ...
- Vim常用操作(1)-常用指令
1.清空文件内容 Normal模式下,先输入"gg",将光标定位到文件首,然后输入"dG",文件就被清空了.当然也可以直接输入"ggdG".
- 大白话说GIT常用操作,常用指令git操作大全
列一下在开发中用的比较多的git指令 git clone https://github.com/chineseLiao/Small-career // 克隆远程仓库到本地 git add . // 把 ...
- FastJson的常用操作
FastJson的常用操作 2017-06-05 常用操作包括以下内容: 对象与(JsonObject或JsonArray)与String的互换 String转换为(JsonObject或JsonAr ...
- Hbase到Solr同步常用操作
Hbase到Solr同步常用操作 1. 整体流程 2. 常用操作 Hbase常用操作 Solr常用操作 hbase-index常用操作 3. 其他资料 Lily HBase Indexer使用整理 h ...
- Linux - nginx基础及常用操作
目录 Linux - nginx基础及常用操作 Tengine淘宝nginx安装流程 nginx的主配置文件nginx.conf 基于域名的多虚拟主机实战 nginx的访问日志功能 网站的404页面优 ...
- gcc与makefile编译 BY 四喜三顺
gcc编译控制过程:(假设源代码为a.c)(1)源文件到预处理文件: gcc -E -o a.cxx a.c a.cxx显示调用哪些头文件(2)生成汇编代码: g ...
- Linux常用操作练习
Linux常用操作练习 练习一:安装CentOS 1.设置为1G内存(才有图形界面).10G硬盘 2.分给交换分区2G(4G一下2G,8G-32G分4G-8G) 练习二:安装CentOS迷你版 1.安 ...
- GreenPlum-数据存储目录迁移及常用操作
一.环境介绍 Greenplum5 3节点集群,Centos7.2虚拟机, 二.需求 因为/home目录磁盘空间已满,需要将Greenplum的数据存储目录转移到新的分区/opt目录下,虚拟机磁盘管理 ...
随机推荐
- C# / VB.NET 获取PDF文档的数字签名信息
文档中的数字签名具有不可否认性,可有效防伪防篡改.对文档中已有的数字签名信息,可通过一定方法获取,下面通过程序代码介绍如何来实现.程序中,使用了Spire.PDF.dll,版本:6.11.6,可自行在 ...
- 云图说|图解开天企业工作台MSSE
摘要:开天企业工作台是面向企业用户的一站式数字工作台. 本文分享自华为云社区<[开天aPaaS]图解开天企业工作台MSSE>,作者:开天aPaaS小助手. 开天企业工作台(MacroVer ...
- CG行业云渲染服务的演进之路
摘要:影视动画.特效制作等行业渲染需求量增多,4K/6K以及各高分辨率会陆续成为主流,本地算力与存储资源已无法满足现有任务量.而随着大环境的演变,CG行业发展已进入发展快车道.来自赞奇科技的CEO金伟 ...
- Axure 鼠标和键盘交互
- Kubernetes(K8S) Service 介绍
定义一组 Pod 的访问规则 存在的意义 防止 Pod 失联(服务发现),Pod 重启后,IP会变 定义一组 Pod 访问策略,负载均衡 Pod 和 Service 关系 根据 label 和 sel ...
- SpringBoot Docker 发布到 阿里仓库
1. 创建仓库 管理里面,可以查看详细的信息 设置登录密码 2. 接下来,将本地镜像推到阿里 : SpringBoot Docker 发布 docker commit 这部分可以不操作 docker ...
- C++11实用特性3 --智能指针
1 智能指针 在C++中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露.解决这个问题最有效的方法是使用智能指针(smart pointer).智能指针是存储指向动态分配(堆)对象指针的 ...
- 最优订单执行算法相关Paper介绍
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 随着量化交易.高频交易的竞争日益激烈,事实证明,交易执行显着影响量化策略的投资绩效. 因此,许多从业者开 ...
- 阿里云Imagine Computing创新技术大赛正式开启!
阿里云 Imagine Computing 创新技术大赛,是由阿里云与英特尔主办,阿里云天池平台.边缘云.视频云共同承办的顶级赛事,面向个人开发者和企业的边缘云领域算法及实时音视频应用类挑战. 本次创 ...
- SuperSocket 简单示例
这是一个SuperSocket 简单示例,包括服务端和客户端. 一.首先使用NuGet安装SuperSocket和SuperSocket.Engine 二.实现IRequestInfo(数据包): 数 ...


