makefile文件的编写
makefile文件makefile的使用场景makefile用于编译大量的.c文件 或者是分文件编写的包含多个 .h 多个.c文件 和主文件 将其转换为可执行文件 。 makefile的作用正是简化了上面的步骤makefile的使用前提是掌握gcc 然后循序掌握其他内容1 - 从简单的gcc 操作 到 转换为makefile如我们要将 main.c 变为可执行文件 main需要经历 gcc -E gcc -S gcc -C当然对于单个.c文件转变为可执行文件我们可以直接使用gcc -C main.c -o main在makefile中main : main.c gcc -c main.c -o mainmain 是目标文件 main.c是依赖文件 下面必须用tab键 开头书写命令若命令不存在的话则无需说明 makefile中 目标文件一定要有 但依赖文件 和命令列表 可以没有目标 就是你要产生的文件可以是 obj 文件执行顺序编写一个makefile 文件binggo :test test2 echo hello all test: echo hello test test2: echo hello test2makefile 默认会以文件中的第一个目标为最终目标 也就是 这里的 binggo, binggo 目标有两个依赖test 和test2 .同样test 和test2 也作为目标 ,但他们不存在依赖文件。执行顺序 先执行依赖 test ,再执行依赖 test2 ,在依赖满足后 执行目标文件可以使用 make makefile -n 来看一下执行过程echo hello test echo hello test2 echo hello all再看多个.c文件编写的情况提供 add.c mul.c sub.c add.h mul.h sub.h test.c 要求 将他们变为可执行文件其中的函数形式为/*add.c*/#includeadd.hintadd(intx,inty){returnxy;}/*mul.c*/#includemul.hintmul(intx,inty){returnx*y;}/*sub.c*/#includesub.hintsub(intx,inty){returnx-y;}/*test.c*/#includeadd.h#includesub.h#includemul.h#includestdio.hintmain(void){intx2;inty4;printf(%d,add(x,y));printf(%d,sub(x,y));printf(%d,mul(x,y));printf(hello);return0;}/*add.h*/#ifndef__ADD_H__#define__ADD_H__intadd(intx,inty);#endif/*__ADD_H__*//*mul.h*/#ifndef__MUL_H__#define__MUL_H__intmul(intx,inty);#endif/*__MUL_H__*//*sub.h*/#ifndef__SUB_H__#define__SUB_H__intsub(intx,inty);#endif/*__SUB_H__*/使用gcc 的方式gcc add.c sub.c mul.c test.c -o test说明由于这里头文件和 多个c文件在同一个 目录下所以不需要使用 -I 指定头文件使用 makefile的方式test: add.c sub.c mul.c test.c gcc add.c sub.c mul.c test.c -o test此时 目标文件test依赖 test: add.c sub.c mul.c test.c 所有c文件首先确保程序已经执行一次产生test可执行文件然后我们对 add.c做一下修改比如 使用touch add.c 更新一下时间戳然后再执行一下 make -n 执行顺序如下gcc add.c sub.c mul.c test.c -o test可见他会把所有的 .c文件全部在执行一次。解决办法当存在多个 c文件时我们需要借助 c 文件生成的 obj文件.o文件修改makefiletest:add.o sub.o mul.o test.o gcc add.o sub.o mul.o test.o -o test add.o:add.c gcc -c add.c -o add.o mul.o:mul.c gcc -c mul.c -o mul.o sub.o:sub.c gcc -c sub.c -o sub.o test.o:test.c gcc -c test.c -o test.o clean: rm *.o当我们的 add.c被修改之后 目标 add.o 就会重新被执行 重新被执行的命令也就只有被修改的那部分同样的我们在已经执行过一次的前提下touch add.c ,表示add.c 被更新然后使用 make -n展示编译过程gcc -c add.c -o add.o gcc add.o sub.o mul.o test.o -o test可见我们使用.o 文件的目的是为了当存在多个 . c文件时 我们若针对特定几个 .c文件 修改 make只会重新编译我们修改过后的那几个.c文件 并不会全部编译 这样就能节省时间 后续会谈到变量的介绍