makefile 学习一

最近在学习nginx,由于实在linux下,一些代码需要用makefile文件来编译,比较节省时间。因为在nginx中添加一个新的模块如果用./configure方法来添加,特别是当你的代码有错时,修改以后又./configure,那么没编译一次都需要几分钟,实现在受不了了,就学习一下makefile,另一个原因是自己以前没有接触过linux,跟没有在linux下编写过代码,这次决定在学nginx的同时学习一个linux编程,当然就有必要学习一下makefile(按需求学习,重点放在学习nginx)。

gcc编译过程

(1)预处

理:生成test.i文件

# cpp test.c-o test.i   //或者

# cpp test.c > test.i    //或者

# gcc -E test.c -o test.i

 

(2)编译:生成test.s文件

# gcc -S test.i

 

(3)汇编:生成test.o文件

# as -o test.o test.s    //或者

# gcc -c test.s -o test.o

 

(4)链接:生成可执行文件test

# gcc -o test test.o

例子:

##程序运行的四个过程
gcc -E test.c -o test.i #预编译
gcc -S test.i -o test.s #汇编
gcc -c test.s -o test.o #编译
gcc -o test test.o      #link

makefile的第一个例子:

main.c的代码:

#include <stdio.h>
#include <stdlib.h>
#include "print.h"
#include "computer.h"

int main()
{
    print("xxxx");
    printf("%d\n", ret_add(1, 2));
    return 0;
}

print.h的代码:

#include <stdio.h>

void print(const char *str);

print.c的代码:

#include "print.h"

void print(const char *str)
{
   if (str == NULL)
   {
      printf("Empty String\n");
   }
   else
   {
      printf("%s\n", str);
   }
}

computer.h的代码:

int ret_add(int a, int b);

computer.c的代码:

#include "computer.h"

int ret_add(int a, int b)
{
   return a+b;
}

用makefile来编译main.c:

main : main.o print.o computer.o
       gcc -o main main.o print.o computer.o
main.o : main.c print.h computer.h
       gcc -c main.c
print.o : print.c print.h
       gcc -c print.c
computer.o : computer.c computer.h
       gcc -c computer.c

命令make -f mymakename

注意有时候会报如下错误:

makefile:11: *** 遗漏分隔符 。 停止.

这是因为gcc命令是以TAB开始的,所以所有的gcc命令之前必须加上一个TAB键

以上“:”左边的都称为目标文件,computer.o print.o main.o main 都是目标文件,但一个makefile只有一个最终目标文件,其他目标文件都是为这个最终目标服务的,main是最终目标,其他目标都是服务于最终目标main,或者main依赖于其他目标。

“:”右边的是为生成左边的目标必须依赖的文件。computer.o的生成依赖预computer.c computer.h, main.o的生成依赖于main.c print.h  couputer.h等

一些有用的变量:

[email protected]目标文件。 比如computer.o print.o main.o main

$^所有依赖文件。比如main.o所有的依赖文件是main.c print.h  couputer.h

$<所有依赖文件的第一文件。比如main.o所依赖的第一个文件是main.c

所以makefile可以这样写:

main : main.o print.o computer.o
	gcc -o [email protected] $^
main.o : main.c print.h computer.h
	gcc -c $<
print.o : print.c print.h
	gcc -c $<
computer.o : computer.o computer.h
	gcc -c $<

自动推到机制

makefile:

main : main.o print.o
computer.o
	gcc -o main main.o print.o computer.o
main.o : print.h computer.h
print.o : print.h
computer.o : computer.h

make会根据目标文件自动推到需要的.c(.h?)文件,并且调用gcc去编译,不如print.o这个目标,make知道需要computer.c这个文件并且条用gcc去编译。

使用变量

makefile

objects = main.o
print.o computer.o
main : $(objects)
	gcc -o main $(objects)
main.o : main.c print.h computer.h
	gcc -c main.c
print.o : print.c print.h
	gcc -c print.c
computer.o : computer.c computer.h
	gcc -c computer.c
.PHONY: clean
clean:
	-rm main $(objects)

makefile中可以使用变量,比如使用变量objects来保存目标文件。</p>

使用变量的好处是我们可以是修改变量的值,而不用修改相应的依稀项。比如我们定义一个变量depend = main.c print.h comput.h 来保存main.o的依赖项,当main.o的依稀项增加或减少时我们只修改depend这个变量就可以了。

比如我们新增一个文件create.h,我们只需要在depend的之后加入这个文件名就可以了,这在大的项目中很节省时间。

时间: 2024-10-12 16:09:39

makefile 学习一的相关文章

【Linux学习】Makefile学习(二)

FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 40975    Accepted Submission(s): 13563 Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats g

MakeFile 学习

MakeFile 学习 1.静态模式 objects = foo.o bar.o all: $(objects) $(CC) $(CFLAGS) -o -o [email protected] $^ $(objects): %.o: %.c $(CC) -c $(CFLAGS) $< -o [email protected] 上面的例子中,指明了我们的目标从$object中获取,"%.o"表明要所有以".o"结尾的目标,也就是"foo.o bar.o

[转]Windows平台下Makefile学习笔记

Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开发,但我还没安装VS2010,我想在VS2008下编译这些代码):另一方面源码在服务器端编译的话,使用IDE的方式编译还是不太方便. 本文主要分为三部分:第一部分讲述namke工具使用makefile的用法:第二部分讲述makefile的主要语法:

Makefile学习教程 跟我一起写 Makefile

https://github.com/zhangliyong/myknowledge/blob/master/Makefile%E5%AD%A6%E4%B9%A0%E6%95%99%E7%A8%8B%20%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99%20Makefile.wiki ++ Makefile学习教程 跟我一起写 Makefile 0 Makefile概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Wi

Makefile 学习&amp;binutils工具集,软件开发利器

gcc -E 能有效的帮助我们解决与宏有关的编译错误: gcc -S能获得一个C源程序文件的汇编程序: gcc -v能获得系统头文件的路径 生成依赖关系: gcc -M gcc -MM 生成不包含系统头文件的依赖关系 指定链接库: gcc -L:告诉gcc可以从哪个目录查找库文件: gcc -l :用于告诉gcc在生成可执行程序时需要链接的库名: 一.静态库生成步骤如下:步骤一:生成 str_out.o 目标文件gcc -c str_out.c注:不加 -o 则生成同名的 *.o 目标文件(st

gcc gdb makefile学习笔记

一.gcc (GNU C compiler )1.预处理  gcc -E aaa.c  -o aaa.i   →  .i(c代码)    ↓ 2. 编译   gcc -S aaa.i  -o aaa.s   →   .s(汇编代码)    ↓3. 汇编   gcc -c  aaa.s  -o aaa.o  →   .o(目标代码-二进制)    ↓4. 链接   gcc aaa.o    -o aaa    →   aaa(可执行文件) 优化编译链接   gcc -O(O2/O3) aaa.o

makefile 学习(一)

1. 使用 makefile 的原因 假如每次都手动输入, 可能会写出这样的编译命令 ? 1 2 3 4 5 6 7 gcc -c main.c gcc -c mytool1.c gcc -c mytool2.c gcc -o main main.o mytool1.o mytool2.o 那么, 可不可以将这个命令写成 shell 脚本呢, 这样就不需要费事打命令了 但是, 使用脚本有一个弊端, 假设只有一个源文件被修改, 那么 shell 命令会把整个项目重新编译一遍 所以, 为了简化编译同

【原创】MakeFile学习成果之模板

花了一个早上,看MakeFile的文档.参考例子,自己写了一个相对通用的MakeFile模板.特放上来,以防丢失.刚学习MakeFile的朋友可以参考看看,高手就当路过了!! 先看目录结构!! ls -R /************************************************.:cc.lst exe/  inc/  inc2/  Makefile  obj/  src/  src2/ ./exe:ftptest* ./inc:ftplib.h ./inc2:qftp.

Makefile学习总结

Makefile用法分析     在linux开发中,应用程序的编译基本都采用GNU的make工具,而make搭配Makefile来实现工程代码的编译,在越是大型复杂的项目中,make的强悍之处越是明显.在使用了一段时间make后,对其用法进行分析.本文是在学习了陈皓的"跟我一起学Makefile"文章后,对自己学习的小结. 一.简单的例子 现在,我们有一个C++的项目需要进行编译,项目包含3个头文件,3个.cpp文件,分别是main.cpp,main.h,read.cpp,read.