makefile就像一个Bash脚本,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

1 例子源码
sin_value.c

#include <stdio.h>#include <math.h>#define pi 3.14159float angle;void sin_value(void){    float value;    value = sin ( angle / 180. * pi );    printf ("\nThe Sin is: %5.2f\n",value);}

cos_value.c

#include <stdio.h>#include <math.h>#define pi 3.14159float angle;void cos_value(void){    float value;    value = cos ( angle / 180. * pi );    printf ("The Cos is: %5.2f\n",value);}

haha.c

#include <stdio.h>int haha(char name[15]){    printf ("\n\nHi, Dear %s, nice to meet you.", name);}

main.c

#include <stdio.h>#define pi 3.14159char name[15];float angle;int main(void){        printf ("\n\nPlease 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 测试。

./mainPlease input your name: xxpcbPlease enter the degree angle (ex> 90): 30Hi, Dear xxpcb, nice to meet you.The Sin is:  0.50The 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 *.omake

此时已经生成生成完毕了。

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 -lmclean:         rm -f main main.o haha.o sin_value.o cos_value.                ccc    -c -o cos_value.o cos_value.cgcc -o main main.o haha.o sin_value.o cos_value.o -lm

4.2 使用变量简化makefile

LIBS = -lmOBJS = main.o haha.o sin_value.o cos_value.omain: ${OBJS}        gcc -o $@ ${OBJS} ${LIBS}clean:         rm -f main ${OBJS}

注意:makefile中的变量与bash中的变量,语法稍有不同,makefile变量的基本语法为:

  • 变量之间用 = 隔开,且 = 两侧可以有空格

  • 变量左边不可以有键空格

  • 习惯上变量以大写字母

  • 引用变量使用大括号或括号,如${变量}或$(变量)

  • $@表示当前的目标

4.3 关于CFLAGS
命令行时输入

例如:

CFLAGS="-Wall" make clean main
  • makefile文件中添加’
LIBS = -lmOBJS = main.o haha.o sin_value.o cos_value.oCFLAGS="-Wall"main: ${OBJS}        gcc -o $@ ${OBJS} ${LIBS}clean:         rm -f main ${OBJS}
  • 使用shell默认的环境变量

命令行中指定的CFLAGS优先级最高,然后是makefile文件中指明的CFLAGS,如果前两种都未指明CFLAGS,则使用shell默认的环境变量。

参考:《鸟哥的Linux私房菜 (基础学习篇 第三版)》

©著作权归作者所有:来自51CTO博客作者mb5fdb1021b5992的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. ACCESS中Dlookup函数使用
  2. 安卓2
  3. 经典面试题(21):以下代码将输出的结果是什么?
  4. JavaScript初学习之常量、变量、函数、匿名函数、箭头函数、闭包
  5. MySql轻松入门系列——第二站 使用visual studio 对mysql进行源
  6. 【死磕JVM】JVM快速入门之前戏篇
  7. 怎样为树莓派安装Rust开发包和相关实用软件?
  8. redis部署bug问题解决:CLUSTERDOWN Hash slot not served
  9. Dart基础——Dart常用语法

随机推荐

  1. Android中UI线程与后台线程交互设计的5种
  2. Android 版本分布数据:Android 2.3 估超过
  3. 如何保证手机端的app访问web服务器的安全
  4. android ImageView 控件
  5. android中@+id 与@string的使用
  6. Android EditText样式自定义
  7. 【Android】Android设计准则
  8. Android 4.0后,自定义Title报错 You canno
  9. 调用android手机微博客户端发送微博
  10. Android 全屏设置