目录

  0. 扫盲
  1. 编译,链接
  2. Makefile文件执行
  3. Makefile书写规则
  4. 案例
  5. Makefile是如何工作的
  6. 拔高,参考

0. 扫盲

Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员(是不是夸张了点,别人说的)。

什么是makefile文件?它是一个指挥文件,指挥着源文件编译的先后顺序,以及如何链接在一起。

1. 编译,链接

2. Makefile文件执行

写好Makefile(或写成makefile)文件后,直接执行命令make,编译器会自动执行makefile里的命令,进行编译、链接知道生成最终可以执行的文件。即

make

3. Makefile书写规则

target : objects
command

其中

  • target是可以是目标文件(.o)也可以是可执行文件,还可以是个标签(最后说)
  • objects是生成target依赖的文件
  • command是make要执行的文件(可以是任意Shell命令)
  • 特殊字符:$@:目标文件,$^:所有的依赖文件,$<:第一个依赖文件

4. 案例

假设文件的关系如下图

写法1

main2 : main2.o sum.o hello.o
g++ -o main2 main2.o sum.o hello.o
main2.o : main2.cc sum.h
g++ -c main2.cc
sum.o : sum.cc sum.h hello.h
g++ -c sum.cc
hello.o : hello.cc hello.h
g++ -c hello.cc

参数 -o 后面是可执文件; -c后面是待编译的文件。在前两行中写了很多重复的.o文件,可以把它集合起来,用变量表示,如下:

写法2

objects = main2.o sum.o hello.o
main2 : $(objects)
g++ -o main2 $(objects) main2.o : main2.cc sum.h
g++ -c main2.cc
sum.o : sum.cc sum.h hello.h
g++ -c sum.cc
hello.o : hello.cc hello.h
g++ -c hello.cc

GUN的make相当强大,它可以自动推导文件集文件依赖关系,写法如下:

写法3

objects = main2.o sum.o hello.o
main2 : $(objects)
g++ -o main2 $(objects) main2.o : sum.h
sum.o : sum.h hello.h
hello.o : hello.h

文件执行完了以后生成很多.o文件,能不能可以删除掉,可以的,写上命令(例如clean),下面是执行的操作,例如:

写法4

objects = main2.o sum.o hello.o
main2 : $(objects)
g++ -o main2 $(objects) main2.o : sum.h
sum.o : sum.h hello.h
hello.o : hello.h clean:
rm *.o

这样执行 make clean,就会执行rm *.o 删除所有的.o文件,即

make clean

5. Makefile如何工作的?

  1. 输入make后,会在目录找Makefile、makefile
  2. 如果找到,它会在文件中找到第一个目标文件(例子中的main2)作为最终的目标文件
  3. 如果main2不存在,就依靠后边的.o文件生成
  4. 如果后边的.o不存在,就利用下边的g++ -c 生成
  5. .o文件都够了,就链接生成最终的目标文件

6. 拔高,参考

跟我一起写Makefile-陈皓

实例学习写Makefile文件的更多相关文章

  1. 怎样写Makefile文件(C语言部分)

    本文摘抄自"跟我一起写Makefile ",只是原文中我自己感觉比较精要的一部分,并且只针对C语言,使用GCC编译器. 原文请看这里:http://wiki.ubuntu.org. ...

  2. 第一次写Makefile文件

    test.c文件内容 #include <stdio.h> int main(int argc, char const *argv[]) { printf("hahahah\n& ...

  3. linux下使用automake工具自动生成makefile文件

    linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...

  4. 利用qmake生成Makefile文件

    在linux下写程序,免不了要写Makefile文件,用automake,总感觉比较麻烦,linux人喜欢做麻烦的事,以显得风格迥异. 其实用qmake生成Makefile文件相当简单. 1 装好qm ...

  5. C++ Makefile文件编写

    对现有的一个C++动态库文件和调用程序,分别编写Makefile文件,从零开始,这里把自己弄明白的一些东西分享给大家. 1.必须明确Linux下,C++的编译器是g++,C语言的是gcc.网上大多数又 ...

  6. 如何编写makefile文件

    最近一直在学习makefile是如何编写的.       当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make ...

  7. Makefile文件应用——simple项目

    学习资料 本文主要参考资料:驾驭Makefile(李云).pdf 原理 (1)最基本的语法 targets: prerequisites command targets是目标,prerequisite ...

  8. 写makefile时候的cc和gcc

    Linux 下 的 cc 和 gcc     Linux 下 的 cc 和 gcc 周银辉 在Linux下一会看到cc,另一会又看到gcc,感觉又点混乱的样子.它们是同一个东西么,有啥区别呢 一分为二 ...

  9. 一点一点学写Makefile(3)-增加第三方库和头文件

    我们在写代码的时候不一定都是有自己来完成,一个工程中会大量使用一些比较优秀的动态库.静态库等,我们在使用这些库完成所有的代码后,需要在编译的时候将这些库使用的头文件添加到我们的工程上,将他的库文件也添 ...

随机推荐

  1. Elastix 禁用SSL(https),还原为 http 访问

    1.相关配置文件目录: Apache的配置文件:httpd.conf,位于:/etc/httpd/conf/httpd.conf,配置文件中包含 Include conf.d/*.conf ,引入了  ...

  2. Configure Log Shipping

    准备工作 两台装有的Windows Server 2012R2以及SQL Server 2012的服务器 下载评估版 Windows Server 2012 R2 下载 Microsoft SQL S ...

  3. ASP.NET——拒绝访问。 (异常来自HRESULT:0x80070005 (E_ACCESSDENIED))

    运行ASP.NET网站的时候出现下面这个问题,这个问题如图: 这个问题的解决方法为: 运行dcomcnfg 点 组件服务->服务->电脑->我的电脑->DCOM 配置 找到&q ...

  4. C#二维数组及其本质(转)

    C#中二维数组包含两类:二维数组和数据矩阵.(这是我个人分类法,我认为比较能反映本质). 如上图,是二维数组,横向为第一维度,纵向为第二维度,不同维度可以有不同长度. 如果去掉元素7,那么上图也可能是 ...

  5. 未能加载文件或程序集“Report.Basic”或它的某一个依赖项。试图加载格式不正确的程序

    出现问题如下: 解决办法: 这是由于没有开启32位程序兼容模式 具体操作如下:找到对应的程序池--------高级设置-------修改“启用32位应用程序”状态修改为true

  6. Andriod WIFI驱动模块

    一:什么是WIFI WIFI是一种无线连接技术,可用于手机.电脑.PDA等终端.WIFI技术产生的目的是改善基于IEEE802.11标准的无线网络产品之间的互通性,也就是说WIFI是基于802.11标 ...

  7. thinkphp通行证服务,验证登录,注销登录

    <?php /** * 通行证服务 */ class PassportService extends Service { /** * 验证用户或者管理员是否已登录 * @return boole ...

  8. IOS开发问题录:如何在Swift中引入Head文件?

    最近在学习IOS开发,从一个简单的登录开始,逐步解决了一个网络访问.获取控件值等问题,遇到了信息加密的问题. 做为IOS的入门者,信息加密需要解决如下几个问题: 1.IOS的MD5加密有没有固定函数, ...

  9. C# list 去重

    /// <summary> /// 汽车商标 获取 /// Redis Key=zgqp315_Redis_TrademarkC_List /// </summary> /// ...

  10. bnuoj 16493 Just Pour the Water(矩阵快速幂)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=16493 [题解]:矩阵快速幂 [code]: #include <cstdlib> #i ...