Linux makefile使用基础
时间:2022-07-22
本文章向大家介绍Linux makefile使用基础,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
makefile就像一个Bash脚本,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
1 例子源码
sin_value.c
#include <stdio.h>
#include <math.h>
#define pi 3.14159
float angle;
void sin_value(void)
{
float value;
value = sin ( angle / 180. * pi );
printf ("nThe Sin is: %5.2fn",value);
}
cos_value.c
#include <stdio.h>
#include <math.h>
#define pi 3.14159
float angle;
void cos_value(void)
{
float value;
value = cos ( angle / 180. * pi );
printf ("The Cos is: %5.2fn",value);
}
haha.c
#include <stdio.h>
int haha(char name[15])
{
printf ("nnHi, Dear %s, nice to meet you.", name);
}
main.c
#include <stdio.h>
#define pi 3.14159
char name[15];
float angle;
int main(void)
{
printf ("nnPlease input your name: ");
scanf ("%s", &name );
printf ("nPlease enter the degree angle (ex> 90): " );
scanf ("%f", &angle );
haha( name );
sin_value( angle );
cos_value( angle );
}
分析4个源文件,main.c需要使用另外3个文件中的函数,并且函数文件又用到了math库。
2 手动逐一操作
下面先用gcc进行编译链接执行: 1 编译4个.c源文件,生成对应的.o目标文件。
gcc -c main.c haha.c sin_value.c cos_value.c
2 再进行链接,注意添加库目录。
gcc -o main main.o haha.o sin_value.o cos_value.o -lm -L/usr/lib -L/lib
3 测试。
./main
Please input your name: xxpcb
Please enter the degree angle (ex> 90): 30
Hi, Dear xxpcb, nice to meet you.
The Sin is: 0.50
The Cos is: 0.87
3 使用makefile
3.1 创建一个makefile
vim makefile
,文件并编辑如下:
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
注意:第2行的开头的空格是键。
3.2 使用编解的makefile进行自动编译
编译器前先清除之前生成的文件,再使用make命令编译:
rm -f main *.o
make
此时已经生成生成完毕了。
3.3 尝试再次使用make编译
查看效果:
make
make: 'main' is up to date.
可以看到,由于程序没有修改过,因而没有重新编译,只是进行更新操作。
4 完善makefile
4.1 添加clean功能
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main main.o haha.o sin_value.o cos_value.o
此时,makefile里有两个目标:main与clean,使用make clean
命令即可自动清除之前生成的文件,使用make main
或make
命令即可重新编译,也可以连起来使用make clean main
命令实现先清除再编译。
make clean main
rm -f main main.o haha.o sin_value.o cos_value.o
cc -c -o main.o main.c
cc -c -o haha.o haha.c
cc -c -o sin_value.o sin_value.c
cc -c -o cos_value.o cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
4.2 使用变量简化makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o $@ ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
注意:makefile中的变量与bash中的变量,语法稍有不同,makefile变量的基本语法为:
- 变量之间用
=
隔开,且=
两侧可以有空格 - 变量左边不可以有键空格
- 习惯上变量以大写字母
- 引用变量使用大括号或括号,如${变量}或$(变量)
- $@表示当前的目标
4.3 关于CFLAGS
- 命令行时输入
例如:
CFLAGS="-Wall" make clean main
- makefile文件中添加’
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS="-Wall"
main: ${OBJS}
gcc -o $@ ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
- 使用shell默认的环境变量
命令行中指定的CFLAGS优先级最高,然后是makefile文件中指明的CFLAGS,如果前两种都未指明CFLAGS,则使用shell默认的环境变量。
参考:《鸟哥的Linux私房菜 (基础学习篇 第三版)》
- ASM 翻译系列第二十一弹:ASM Attributes Directory
- Linux:sed命令详解
- ASM 翻译系列第二十二弹:ASM Internal ASM file number 8
- Ghost安装Win7/XP后自动恢复IP的批处理
- ASM 翻译系列第二十三弹:ASM Internal ASM files number 12 and 254
- Shell脚本的简单排错法及调试程序bashdb
- ASM 翻译系列第二十四弹:ASM Internal ASM files number 10 and 11
- Redhat设置NFS挂载的简单步骤
- WordPress后台首页显示RSS错误的解决办法
- ASM 翻译系列第十九弹:ASM Internal ASM Continuing Operations Directory
- ASM 翻译系列第二十五弹:ASM 高级知识 When will my rebalance complete
- ASM 翻译系列第二十六弹:ASM 高级知识 Where is my data
- LVS+Keepalived负载均衡主备&双主架构全攻略
- ASM 翻译系列第二十八弹:ASM INTERNAL Partnership and Status Table
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法