之前在Windows下学习的时候,我一直使用Eclipse写C语言程序,比较标准C,GTK+.后来忽有一天学习Linux的时候,看到软件安装那里说了make这个工具,一时之间大是喜欢.由于我本人特别喜欢命令行的方式,因而我把系统换成了Ubuntu,安装了gcc,g++,gdb,make等一系列工具,下载了网上流传十分之广的<跟我一块儿写Makefile>. shell
而后我如今写程序,学校的做业我就是在Windows下用eclipse写代码,用UE写makefile,在CMD中make编译 app
若是是我本身学习的话,那绝对是Linux下写,那编译速度,那流畅,那感受,, eclipse
下面是一个很小的程序,就是在控制台输入两个整数,而后输出它们的和 函数
#include<stdio.h> #include"sum.h" int main( void ){ int a = 0; int b = 0; puts("输入两个整数:"); scanf("%d %d",&a,&b); printf("%d + %d = %d\n",a,b,sum(a,b)); return 0; }
#ifndef _SUM_H_ #define _SUM_H_ int sum( int a , int b ); #endif//_SUM_H_
#include"sum.h" int sum( int a , int b ){ return a + b; }
OBJS=test.o sum.o test:${OBJS} gcc -o test ${OBJS} test.o:test.c sum.h gcc -c -Wall test.c sum.o:sum.c sum.h gcc -c -Wall sum.c .PHONY:clean clean: -rm test ${OBJS}
因而个人运行结果是: 工具
不过再我看了<跟我一块儿写makefile> Makefile介绍中的隐晦规则后,个人makefile文件成了: 学习
OBJS=test.o sum.o test:${OBJS} test.o:test.c sum.h sum.o:sum.c sum.h .PHONY:clean clean: -rm test ${OBJS}
因而,个人编译效果是: ui
在执行make时,不是我但愿的gcc -c -Wall,而是cc -c,这显示不是我想要的.因而我再查资料.终于在百度百科上查到了资料,因而makefile成了: spa
CC = gcc CCFLAGS = -c -Wall OBJS=test.o sum.o test:${OBJS} test.o:test.c sum.h sum.o:sum.c sum.h .PHONY:clean clean: -rm test ${OBJS}
运行效果: 命令行
其中cc命令是UNIX上的C编译器,在Linux中cc和gcc就是一个东西: code
laolang@laolang-Lenovo-G470:~/code/makefile/genwo/one/five$ which cc /usr/bin/cc laolang@laolang-Lenovo-G470:~/code/makefile/genwo/one/five$ cd /usr/bin laolang@laolang-Lenovo-G470:/usr/bin$ ls -l cc lrwxrwxrwx 1 root root 20 10月 14 03:48 cc -> /etc/alternatives/cc laolang@laolang-Lenovo-G470:/usr/bin$ cd /etc/alternatives/ laolang@laolang-Lenovo-G470:/etc/alternatives$ ls -l cc lrwxrwxrwx 1 root root 12 10月 14 03:48 cc -> /usr/bin/gcc laolang@laolang-Lenovo-G470:/etc/alternatives$
在网上看到过可使用 make 实现所有从新编译,看了伪目标,个人makefile就成了这样:
CC=gcc CCFLAGS=-c -Wall OBJS=test.o sum.o test:${OBJS} test.o:test.c sum.h sum.o:sum.c sum.h .PHONY:clean-all clean-objs clean-app rebuild clean-all:clean-objs clean-app clean-objs: -rm ${OBJS} clean-app: -rm test rebuild: clean-all make
不过运行效果好像不太理想
laolang@laolang-Lenovo-G470:~/code/makefile/genwo/one/five$ make rebuild rm test.o sum.o rm test make make[1]: 正在进入目录 `/home/laolang/code/makefile/genwo/one/five' gcc -c -o test.o test.c gcc -c -o sum.o sum.c gcc test.o sum.o -o test make[1]:正在离开目录 `/home/laolang/code/makefile/genwo/one/five' laolang@laolang-Lenovo-G470:~/code/makefile/genwo/one/five$
在写主目标的依赖时,要写不少的.o,并且在写主程序的命令时,要写宏替换,因而在看了<Linux C 一站式学习中的>makefile相关部分后,个人Makefile 成了:
# 程序的名字 PROGRAM=test # 程序源代码集 C_SOURCES=test.c sum.c # .o文件 # ${C_SOURCES:.c=.o} 是一个变量替换语法 # 把全部的.c替换为.o C_OBJS=${C_SOURCES:.c=.o} # CC 指定 gcc 为编译器 # CCFLAGS 指定编译选项 CC=gcc CCFLAGS=-c -Wall # 默认目标 all:${PROGRAM} # 建立主程序 ${PROGRAM}:${C_OBJS} ${CC} -o $@ ${C_OBJS} # 生成各.o文件 test.o:test.c sum.h sum.o:sum.c sum.h .PHNOY:clean run rebuild # 清除文件 clean: -rm ${C_OBJS} ${PROGRAM} # 运行程序 run: @echo "运行程序\n" ./${PROGRAM} # 从新构建 rebuild: @echo "从新构建\n" make clean && make
makefile的基本语法:
目标:依赖
命令
现阶段基本上上也就是使用自动推导依赖,从而不用写那些gcc -c -Wall test.c 或者 gcc test.o -o test,再有就是使用伪目标实现从新编译和清除目标文件和可可执行文件
而后仍是有问题
1. 使用@echo进行输出时,老是会出问题,我又不想写太多的gcc命令
2.自动化变量和多个makefile的使用
3.条件判断