关于Makefile,Makefile.in,Makefile.am,Configure功能及相互关系的问题

目录

    • makefile写法
    • 1. 简介
    • 2. 上路之前
    • 3. 一个简单的例子
    • 4.说明:
      • 4.1、autoscan
      • 4.2、 configure.scan
      • 4.3、aclocal
      • 4.4、autoconf
      • 4.5、Makefile.am
      • 4.6、 automake
      • 4.7、Makefile

makefile写法

在 Unix 上写程式的人大概都碰过 Makefile,尤其是用 C 来开发程式的人。用 make来开发和编译程式的确很方便,可是要写出一个 Makefile就不简单了。偏偏介绍 Makefile 的文件不多,GNU Make 那份印出来要几百页的文件,光看完 Overview 就快阵亡了,难怪许多 人闻 Unix 色变。
本文将介绍如何利用 GNU Autoconf 及 Automake 这两套软体来协助我们『自动』产生 Makefile 档,并且让开发出来的软体可以像 Apache, MySQL 和常见的 GNU 软体一样,只要会 ./configure'',make’’, ``make install’’ 就可以把程式安装到系统中。如果您有 心开发 Open Source 的软体,或只是想在 Unix 系统下写写程式。希望这份介绍文件能帮助您轻松地进入 Unix Programming 的殿堂。

1. 简介

Makefile 基本上就是『目标』(target), 『关连』(dependencies) 和『动作』三者所组成的一连串规则。而 make 就会根据 Makefile 的规则来决定如何编译 (compile) 和连结 (link) 程式。实际上,make 可做的不只是编译和连结程式,例如 FreeBSD 的 port collect ion 中, Makefile 还可以做到自动下载原始程式套件,解压缩 (extract) ,修补 (patch),设定,然後编译,安装至系统中。
Makefile 基本构造虽然简单,但是妥善运用这些规则就也可以变出许多不同的花招。却也因此,许多刚开始学习写 Makefile 时会感到没有规范可循,每个人写出来的 Makefile 长得都不太一样,不知道从何下手,而且常常会受限於自己的开发环境,只要环境变数不同或路 径改一下,可能Makefile 就得跟着修改。虽然有 GNU Makefile Conventions (GNU Makefile 惯例) 订出一些使用 GNU 程式设计时撰写 Makefile 的一些标准和规范,但是内容很长而且很复杂, 并且经常做些调整,为了减轻程式设计师维护 Makefile 的负担,因此有了Automake。

程式设计师只需写一些预先定义好的巨集 (macro),交给 Automake 处理後会产生一个可供Autoconf 使用的 Makefile.in 档。再配合利用Autoconf 产生的自动设定档 configure即可产生一份符合 GNU Makefile惯例的 Makeifle 了。

2. 上路之前

在开始试着用 Automake 之前,请先确认你的系统已经安装以下的软体: 1. GNU Automake 2. GNU Autoconf 3. GNU m4 4. perl 5. GNU Libtool (如果你需要产生 shared library)
我会建议你最好也使用 GNU C/C++ 编译器 、GNU Make 以及其它 GNU 的工具程式来做为开发的环境,这些工具都是属於 Open Source Software不仅免费而且功能强大。如果你是使用Red Hat Linux 可以找到所有上述软体的 rpm 档,FreeBSD 也有现成的 package 可以直 接安装,或着你也可以自行下载这些软体的原始档回来 DIY。以下的范例是在 Red Hat Linux 5.2 + CLE2 的环境下所完成的。
在这里插入图片描述

3. 一个简单的例子

Automake 所产生的 Makefile 除了可以做到程式的编译和连结,也已经把如何产生程式文件(如 manual page, info 档及 dvi 档) 的动作,还有把原始程式包装起来以供散 的动作都考虑进去了,所以原始程式所存放的目录架构最好符合 GNU 的标准惯例,接下来我拿hello.c 来做为例子。
在工作目录下建立一个新的子目录 devel'',再在 devel 下建立一个hello’’ 的子目录,这个目录将作为我们存放 hello 这个程式及其相关档案的地方:
% mkdir devel
% cd devel
% mkdir hello
% cd hello

用编辑器写个 hello.c 档,

#include <stdio.h>

int main(int argc, char *argv[])
{
printf(“Hello GNU!\n”);
return 0;
}
在这里插入图片描述
接下来就要用 Autoconf 及 Automake 来帮我们产生 Makefile 档了。

1、用 autoscan 产生一个 configure.in 的雏型,执行 autoscan 後会产生一个configure.scan 的档案,我们可以用它做为configure.in档的蓝本。
. 在这里插入图片描述
2、 编辑 configure.scan 档,如下所示,并且把它的档名改成configure.in
autoconfig用户参考手册 http://www.gnu.org/software/autoconf/manual/autoconf.html
automake用户参考手册 http://www.gnu.org/software/automake/manual/automake.html
修改后的configure.in文件内容如下:

.# -- Autoconf --
.# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])

.# Checks for programs.
AC_PROG_CC

.# Checks for libraries.

.# Checks for header files.

.# Checks for typedefs, structures, and compiler characteristics.

.# Checks for library functions.
AC_CONFIG_FILES(Makefile)
AC_OUTPUT
在这里插入图片描述
上面以AC开头的宏来自autoconf,以AM开头的宏来自automake。要从autoconf或 automake中寻求帮助,这一点很有用。以GNOME开头的宏来自于Gnomemacros目录。这些宏都是用m4宏语言写的。如果将 autoconf和automake安装在/usr目录下,autoconf和automake中的标准宏一般放在/usr/share/aclocal 目录下。

3、 执行 aclocal 和 autoheader ,分别会产生 aclocal.m4 及 configure.h.in 两个档案
% aclocal
% autoheader
注意:要修改文件名
在这里插入图片描述
4、编辑 Makefile.am 档,内容如下 :

.# cat Makefile.am
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = hello
hello_SOURCES = hello.c
hello_CPPFLAGS = -I /usr/include/
在这里插入图片描述
5、 执行 automake --add-missing ,Automake 会根据 Makefile.am 档产生一些档案,包含最重要的 Makefile.in
% automake --add-missing

configure.ac:11: installing ‘./compile’
configure.ac:6: installing ‘./install-sh’
configure.ac:6: installing ‘./missing’
Makefile.am: installing ‘./depcomp’
在这里插入图片描述
6. 执行 autoconf 得到 configure可执行脚本文件

% autoconf
在这里插入图片描述
7. 执行测试:

执行./configure
执行 make 此时应该已经生成可执行文件,ls看一下
执行 make install
在这里插入图片描述
在这里插入图片描述
8. 测试程序:#可执行文件
make clean 清除编译过程生成的文件
make uninstall 卸载
在这里插入图片描述

4.说明:

4.1、autoscan

autoscan是 用来扫描源代码目录生成configure.scan文件的 .autoscan可以用目录名做为参数,但如果你不使用参数的 话,那么autoscan将认为使用的是当前目录.autoscan将扫描你所指定目录中的 源文件,并创建configure.scan文件。

4.2、 configure.scan

configure.scan包含了系统配置的 基本选项,里面都是 一些宏定义.我们需要将它改名configure.in

4.3、aclocal

aclocal是 一个perl 脚本程序.aclocal根据configure.in文件的 内容,自动生成aclocal.m4件.aclocal的 定义是 :“aclocal - create aclocal.m4 by scanning configure.ac”.

4.4、autoconf

autoconf是 用来产生configure文件的 .configure是 一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的 系统来产生合适的 Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来.configure.in文件的 内容是 一些宏,这些宏经过autoconf 处理后会变成检查系统
特性.环境变量.软件必须的 参数的 shell脚本.configure.in文件中的 宏的 顺序并没有规定,但是 你必须在 所有宏的 最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏.
  在 configure.ini中:
  #号表示注释,这个宏后面的 内容将被忽略.
  
AC_INIT(FILE)
  这个宏用来检查源代码所在 的 路径.
  
AM_INIT_AUTOMAKE(PACKAGE, VERSION)
   这个宏是 必须的 ,它描述了我们将要生成的 软件包的 名字及其版本号:PACKAGE是软件包
的名字,VERSION是 版本号.当你使用make dist命令时,它会给你生成一个类似helloworld-1.0.tar.gz的 软件发行包,其中就有对应的 软件包的 名字和版本号.

AC_PROG_CC
  这个宏将检查系统所用的 C编译器.
  
AC_OUTPUT(FILE)
  这个宏是 我们要输出的 Makefile的 名字.我们在 使用automake时,实际上还需要用到其他的 一些宏,但我们可以用aclocal 来帮我们自动产生.执行aclocal后我们会得到aclocal.m4文件.产生了configure.in和aclocal.m4 两个宏文件后,我们就可以使用autoconf来产生configure文件了.

4.5、Makefile.am

Makefile.am是 用来生成Makefile.in的 ,需要你手工书写.Makefile.am中定义了一些内容:
AUTOMAKE_OPTIONS
  这个是 automake的 选项.在 执行automake时,它会检查目录下是 否存在 标准
GNU软件包中应具备的各种文件,例如AUTHORS.ChangeLog.NEWS等文件.
我们将其设置成foreign时,automake会改用一般软件包的 标准来检查.

bin_PROGRAMS
  这个是 指定我们所要产生的 可执行文件的 文件名.如果你要产生多个可执行文件,
那么在各个名字间用空格隔开.

helloworld_SOURCES
  这个是 指定产生"helloworld"时所需要的 源代码.如果它用到了多个源文件,
那么请使用空格符号将它们隔开.比如需要helloworld.h,helloworld.c那么请写成:
helloworld_SOURCES= helloworld.h helloworld.c.
  如果你在 bin_PROGRAMS定义了多个可执行文件,则对应每个可执行文件都要定义相对的filename_SOURCES.

4.6、 automake

我们使用automake --add-missing来产生Makefile.in.选项–add-missing的 定义是 “add missing standard files to package”,它会让automake加入一个标准的 软件包所必须的 一些文件.
  我们用automake产生出来的 Makefile.in文件是 符合GNU Makefile惯例的 ,接下来我们只要执行configure这个shell 脚本就可以产生合适的 Makefile 文件了.

4.7、Makefile

在 符合GNU Makefiel惯例的 Makefile中,包含了一些基本的 预先定义的 操作:

make
  根据Makefile编译源代码,连接,生成目标文件,可执行文件.
  
make clean
  清除上次的 make命令所产生的 object文件(后缀为".o"的 文件)及可执行文件.
  
make install
  将编译成功的 可执行文件安装到系统目录中,一般为/usr/local/bin目录.
  
make dist
  产生发布软件包文件(即distribution package).这个命令将会将可执行文件及相关
文件打包成一个tar.gz压缩的 文件用来作为发布软件的 软件包.它会在 当前目录下生成一个名字类似"PACKAGE-VERSION.tar.gz"的 文件.PACKAGE和VERSION,是 我们在 configure.in中定义的 AM_INIT_AUTOMAKE(PACKAGE, VERSION).

make distcheck
  生成发布软件包并对其进行测试检查,以确定发布包的正确性.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西安理工大学863(转载)

原创&#xff1a;https://blog.csdn.net/mzj15101229871/article/details/107613162 &#xff08;博主总结的很完整&#xff0c;很厉害&#xff0c;本人为了查看方便&#xff0c;才转载的。本人只是个小白~&#xff09; 第一章 绪论 考试大纲 1&#xff09;了解数据元素、数…

原理简介_消息通信的利器MQTT协议简介及协议原理

- 没用过但是必须得知道系列 -前言&#xff1a;相比于 XMPP&#xff0c; MQTT 的简单轻量受到了不少工程师的喜爱&#xff0c;从物联网到传统的消息服务&#xff0c;简单可依赖的 MQTT 到底为何让人如此着迷呢&#xff1f;MQTT 协议&#xff0d;MQTT 协议简介及协议原理MQTT(Me…

rtmp协议分析(Message 消息,Chunk分块)

RTMP详细分析&#xff08;三次握手&#xff09; librtmp分析&#xff08;发送数据包处理&#xff09; librtmp分析&#xff08;接收数据包处理&#xff09; 目录1、Message(消息)2、Chunking(Message 分块)2.1、 Basic Header(基本的头信息)2.1.1、Basic Header为1个字节时2.1.…

将Sharepoint Server 2010部署到WINDOWS 7

首先祝CNBLOGS上的筒子们新年快乐。Sharepoint 2010 BETA版发布已经有段时间了&#xff0c;总是感觉MS的步伐要比我们这些追逐他的人快很多&#xff0c;不过确实他的每一次革新总给我们带来了惊喜。 前几天报名参加了SHAREPOINT 2010 DAY 活动(详情)&#xff0c;等待着1月16日体…

嵌入式实训-day1

完全复制一个文件的内容到另外一个文件 思路解析&#xff1a; 首先我这里使用了三个.c文件&#xff0c;分别是&#xff1a;yanyu.c、yanyu_old.c、yanyu_now.c 其中yanyu.c负责将yanyu_old.c中的内容读入到buff缓冲区中&#xff0c;然后再从buff缓冲区中将数据写入到yanyu_no…

计量经济学建模_浅谈统计学模型(兼计量经济学模型)

计量经济学模型是从统计学模型中衍生出来的&#xff0c;故将它们一并放在此处进行说明。实际上&#xff0c;很多人在很久之前就督促我写一篇统计学和计量经济学模型的文章&#xff0c;但我太懒惰&#xff0c;一直拖到现在&#xff0c;也是十分汗颜。先讲一些统计学上的基础故事…

linux文件存储、inode、硬链接、软链接

目录介绍inode的内容inode的大小inode号码目录文件硬链接软链接介绍 文件储存在硬盘上&#xff0c;硬盘的最小存储单位叫做"扇区"&#xff08;Sector&#xff09;。每个扇区储存512字节&#xff08;相当于0.5KB&#xff09;。操作系统读取硬盘的时候&#xff0c;不会…

工具栏的打印图标不见了_显示屏下方的工具栏里的小图标不见了怎么弄回来

优质回答 回答者&#xff1a;昂天大笑出门去一般右下角那些小图标都是与系统同步启动的一些功能&#xff0c;有的是没必要让它们同步启动的&#xff0c;启动的东西越多&#xff0c;系统反应就越慢。你说的工具栏里的小图标没了&#xff0c;可能是那些工具不能和系统同步启动了&…

使用sshfs挂载linux远程服务器目录到windows

目录下载winfsp 和 sshfs-win使用方式1、添加连接2、连接3、其他操作修改&#xff1a;删除&#xff1a;下载winfsp 和 sshfs-win 前往 github 对应项目的 release 中下载最新版本&#xff1a; sshfs-win&#xff1a;https://github.com/billziss-gh/sshfs-win/releases winfs…

法学学士学位的完整形式是什么?

LL.B&#xff1a;拉丁文的Legum Baccalaureus(俗称法学学士) (LL.B: Legum Baccalaureus in Latin (commonly known as Bachelor of Laws)) LL.B is an abbreviation of Legum Baccalaureus in Latin which is generally known as Bachelor of Laws. It is a bachelors degree …

Qt创建工程及导入资源图片

一、打开软件 二、 三、 四、 五、 六、 七、 导入其他文件资源&#xff0c;比如图片资源&#xff1a; 一、 二、 三、 四、 五、 六、导入图片 七、 八、 该图片导入项目里面了

protect 继承_(转)public、protect、private继承方式 C++

C里面的结构体内的成员不受任何机制保护&#xff0c;直接能用&#xff0c;比如StructtypeA.x;StructtypeA.y;StructtypeA.fun();而c则不同&#xff0c;c的类像强化型的结构体public公有继承protected保护继承private私有继承我们知道类的private和protected成员,在类外是不可以…

原型模型| 软件工程

A prototype means a preliminary model of anything which gives us a rough idea about the basic functionalities that the real model would have. The prototyping model follows the same strategy. 原型意味着任何事物的初步模型&#xff0c;这使我们对真实模型具有的基…

librtmp分析(发送数据包处理)

RTMP详细分析&#xff08;三次握手&#xff09; RTMP详细分析(Message 消息&#xff0c;Chunk分块) librtmp分析&#xff08;接收数据包处理&#xff09; rtmp协议中的message的发送涉及有message 分chunk、base header长度的变化、message header长度的变化&#xff0c;只查看…

tomcat没有错,但是还是一闪而过(端口被占用)

首先&#xff0c;看tomcat日志文件&#xff0c;在tomcat目录下有个logs文件夹&#xff0c;进去找到刚才运行时的日志文件。 然后&#xff0c;我的是Address already in use: JVM_Bind <null>:8080&#xff0c;8080端口被占用了。 此时需要将该端口给kill掉 cmd netsta…

librtmp分析(接收数据包处理)

RTMP详细分析&#xff08;三次握手&#xff09; RTMP详细分析(Message 消息&#xff0c;Chunk分块) librtmp分析&#xff08;发送数据包处理&#xff09; rtmp协议中的message的接收涉及有message 组合多个chunk、相对时间戳计算绝对值。 分析一下librtmp库中的int RTMP_ReadP…

动态可缓存的内容管理系统(CMS)(转)

摘要&#xff1a;内容管理系统(CMS)在各大商业站点和门户站点中扮演着重要的角色&#xff0c;是内容有效组织和快速发布极为重要的基础平台。目前主流的内容发布系统都使用静态页面进行内容发布&#xff0c;在我们的实际使用过程中我们深切的感受到静态内容发布存在着很多弊端&…

mysql 自动化 安装_mysql自动化安装

MySQL安装一般使用RPM或者源码安装的方式。RPM安装的优点是快速,方便.缺点是不能自定义安装目录.如果需要调整数据文件和日志文件的存放位置,还需要进行一些手动调整。源码安装的优点是可以自定义安装目录,缺点是编译时间长,过程复杂其实还有一种方式,定制RPM包.它相当于用源码…

hls协议分析

目录1、简介1.1、 综述1.2 、HLS 协议编码格式要求1.3 、HLS 协议优势1.4 、HLS 协议劣势1.5 、框架图2、m3u8文件2.1 、单码率适配流m3u8文件2.2 、多码率适配流m3u8文件2.3 、Playlist file2.4 、Tags3、ts文件3.1 、ts文件结构3.2、ts文件结构部分截图3.3、ts层&#xff08;…

OpenGL 学习笔记(1)初始化窗体

前言 学习OpenGL只是兴趣爱好&#xff0c;因为对图形比较感兴趣.将以OpenGl的红宝书(7)和蓝宝石书(4)为基础,虽然手头有红宝书书&#xff0c;但感觉没蓝宝石书写的好 准备工作 首先要下载一个工具库(GLUT) http://www.opengl.org/resources/libraries/glut/ 只要把相应文件放在…