linux下automake用法
linux下automake用法编译一个简单的源文件main.c,需要自动生成一个makefile,以下是步骤:第一步:在/root/project/main目录下创建一个文件main.c,其内容如下:#include <stdio.h>int main(int argc, char** argv){printf("Hello, Auto Makefile!\n");return 0;}此时状态如下:[root@localhost main]# pwd/root/project/main[root@localhost main]# lsmain.c第二步:运行autoscan , 自动创建两个文件: autoscan.log configure.scan此时状态如下:[root@localhost main]# autoscan[root@localhost main]# lsautoscan.log configure.scan main.c第三步:修改configure.scan的文件名为configure.in查看configure.in的内容:# -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ(2.61)AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)AC_CONFIG_SRCDIR([main.c])AC_CONFIG_HEADER([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_OUTPUT解读以上的文件:# -*- Autoconf -*-# Process this file with autoconf to produce a configure script.# AC_PREREQ:# 确保使用的是足够新的Autoconf版本。
如果用于创建configure的Autoconf的版# 本比version 要早,就在标准错误输出打印一条错误消息并不会创建configure。
AC_PREREQ(2.61)# 初始化,定义软件的基本信息,包括设置包的全称,版本号以及报告BUG时需要用的邮箱地址AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)# 用来侦测所指定的源码文件是否存在,来确定源码目录的有效性AC_CONFIG_SRCDIR([main.c])# 用于生成config.h文件,以便autoheader使用AC_CONFIG_HEADER([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.# 创建输出文件。
在`configure.in'的末尾调用本宏一次。
#AC_OUTPUT修改动作:1.修改AC_INIT里面的参数: AC_INIT(main,1.0, pgpxc@)2.添加宏AM_INIT_AUTOMAKE, 它是automake所必备的宏,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。
3.在AC_OUTPUT后添加输出文件Makefile修改后的结果:# -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ(2.61)AC_INIT(main, 1.0, pgpxc@)AC_CONFIG_SRCDIR([main.c])AC_CONFIG_HEADER([config.h])AM_INIT_AUTOMAKE(main,1.0)# 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_OUTPUT([Makefile])第四步:运行aclocal, 生成一个“aclocal.m4”文件和一个缓冲文件夹autom4te.cache,该文件主要处理本地的宏定义。
此时的状态是:[root@localhost main]# aclocal[root@localhost main]# lsaclocal.m4 autom4te.cache autoscan.log configure.in configure.in~ main.c第五步:运行autoconf, 目的是生成 configure此时的状态是:[root@localhost main]# autoconf[root@localhost main]# lsaclocal.m4 autoscan.log configure.in main.cautom4te.cache configure configure.in~第六步:运行autoheader,它负责生成config.h.in文件。
该工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因此此处没有附加符号定义,所以不需要创建“acconfig.h”文件。
此时的状态是:[root@localhost main]# autoheader[root@localhost main]# lsaclocal.m4 autoscan.log configure configure.in~autom4te.cache config.h.in configure.in main.c第七步:下面即将运行automake, 但在此之前应该做一下准备工作!首先创建一个Makefile.am.这一步是创建Makefile很重要的一步,automake要用的脚本配置文件是Makefile.am,用户需要自己创建相应的文件。
之后,automake工具转换成Makefile.in。
这个Makefile.am的内容如下:AUTOMAKE_OPTIONS=foreignbin_PROGRAMS=mainmain_SOURCES=main.c下面对该脚本文件的对应项进行解释。
其中的AUTOMAKE_OPTIONS为设置automake的选项。
由于GNU(在第1章中已经有所介绍)对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake 执行时会报错。
automake提供了三种软件等级:foreign、gnu和gnits,让用户选择采用,默认等级为gnu。
在本例使用foreign等级,它只检测必须的文件。
bin_PROGRAMS定义要产生的执行文件名。
如果要产生多个执行文件,每个文件名用空格隔开。
main_SOURCES定义“main”这个执行程序所需要的原始文件。
如果”main”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。
例如:若目标体“main”需要“main.c”、“sunq.c”、“main.h”三个依赖文件,则定义main_SOURCES=main.c sunq.c main.h。
要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的file_SOURCES。
其次使用automake对其生成“configure.in”文件,在这里使用选项“—adding-missing”可以让automake自动添加有一些必需的脚本文件。
运行后的状态是:[root@localhost main]# automake --add-missingconfigure.in:8: installing `./missing'configure.in:8: installing `./install-sh'Makefile.am: installing `./depcomp'[root@localhost main]# lsaclocal.m4 config.h.in configure.in~ main.c Makefile.inautom4te.cache configure depcomp Makefile.am missingautoscan.log configure.in install-sh Makefile.am~第八步运行configure,在这一步中,通过运行自动配置设置文件configure,把Makefile.in变成了最终的Makefile。
运行的结果如下:[root@localhost main]# ./configure...config.status: creating Makefile[root@localhost main]# lsaclocal.m4 config.h.in configure.in main.c Makefile.inautom4te.cache config.log configure.in~ Makefile missingautoscan.log config.status depcomp Makefile.am stamp-h1config.h configure install-sh Makefile.am~第九步运行make,对配置文件Makefile进行测试一下此时的状态如下:[root@localhost main]# make...[root@localhost main]# lsaclocal.m4 autoscan.log config.h.in config.status configure.in depcomp main main.o Makefile.am Makefile.in stamp-h1autom4te.cache config.h config.log configure configure.in~ install-sh main.c Makefile Makefile.am~ missing第十步运行生成的文件 main:[root@localhost main]# ./mainHello, Auto Makefile!我用的是ubuntu以上就是全文了.但有一处要改:用aclocal全报有一个m4文件有错.找到报错的那一行.把变量加个中括号就可以了。
Linux命令详解(三).configure、make、makeinstall命令
Linux命令详解(三).configure、make、makeinstall命令这些都是典型的使⽤GNU的AUTOCONF和AUTOMAKE产⽣的程序的安装步骤⼀、基本信息 1、./configure 是⽤来检测你的安装平台的⽬标特征的。
⽐如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。
2、make 是⽤来编译的,它从Makefile中读取指令,然后编译。
3、make install是⽤来安装的,它也从Makefile中读取指令,安装到指定的位置。
注意:AUTOMAKE和AUTOCONF是⾮常有⽤的⽤来发布C程序的东西。
⼆、详细解释 1、configure命令 这⼀步⼀般⽤来⽣成 Makefile,为下⼀步的编译做准备,你可以通过在 configure 后加上参数来对安装进⾏控制,⽐如代码:./configure –prefix=/usr 意思是将该软件安装在 /usr 下⾯,执⾏⽂件就会安装在 /usr/bin (⽽不是默认的 /usr/local/bin),资源⽂件就会安装在/usr/share(⽽不是默认的/usr/local/share)。
同时⼀些软件的配置⽂件你可以通过指定 –sys-config= 参数进⾏设定。
有⼀些软件还可以加上–with、–enable、–without、–disable 等等参数对编译加以控制,你可以通过允许 ./configure –help 察看详细的说明帮助。
2、make 这⼀步就是编译,⼤多数的源代码包都经过这⼀步进⾏编译(当然有些perl或python编写的软件需要调⽤perl或python来进⾏编译)。
如果在 make 过程中出现 error ,你就要记下错误代码(注意不仅仅是最后⼀⾏),然后你可以向开发者提交 bugreport(⼀般在 INSTALL ⾥有提交地址),或者你的系统少了⼀些依赖库等,这些需要⾃⼰仔细研究错误代码。
使用Automake生成Makefile及动态库和静态库的创建
使用Automake生成Makefile及动态库和静态库的创建使用Automake 创建和使用静态库1. 目录结构如下:[c-sharp]view plaincopy1.example2.|——src 目录(存放源代码文件)3. |——hello.c4.|——lib 目录(存放用来生成库的文件)5. |——test.c 用来生成静态库libhello.a6.|——include 目录(存放程序中使用的头文件)7. |——hello.h2. 编写的各个目录下的源文件[c-sharp]view plaincopy1.hello.h 文件2.extern void print(char *);3.test.c 文件4.#include<stdio.h>5.void print(char *msg)6.{7.print(“%s/n”, msg);8.}9.hello.c 文件10.#include “hello.h”11.int main()12.{13.print(“Hello static library!”);//这里用到的是静态库中的函数14.return 0;15.}3. 编写lib/Makefile.am 文件[c-sharp]view plaincopy1.noinst_LIBRARIES=libhello.a2.libhello_a_SOURCES=test.c3.AUTOMAKE_OPTIONS=foreign第一行noinst 表示生成的是静态库,不需要make install ,直接制定它的位置和名字就可以使用。
第二行表示用来生成静态库的源文件。
如果要把静态库生成到其他地方,可以在=后面加上路径(建议用绝对路径,并将所要用到的静态库生成在同一个文件夹下,如lib)。
第三行AUTOMAKE_OPTIONS 是Automake 的选项。
Automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行Automake 时,会检查目录下是否存在标准GNU 软件中应具备的文件,例如 'NEWS'、'AUTHOR'、 'ChangeLog' 等文件。
autoconf与automake的完整例程
autoconf与automake的完整例程一、 automake 的用途automake 和 autoconf 可以自动生成 GNU 的 Makefile ,虽然我们也可以手工写 Makefile ,但是考虑到在多硬件平台上运行,编译环境差异,依赖关系,静态和动态库的生成,等一系列的问题,对于复杂的代码树,用 automake 工具就成了更好的选择。
在下面的例程中,将介绍树型源码包的 Makefile 生成,其中包括生成库文件和可执行文件。
二、完整例程1.建立目录树a) 生成目录树$ mkdir lib$ mkdir src$ mkdir include$ touch include/xy.h$ touch lib/xy1.cpp$ touch lib/xy2.cpp$ touch src/main.cppb) 编辑源代码文件i. include/xy.h 内容如下:void xytest1();void xytest2();ii. lib/xy1.cpp 内容如下:#include <stdio.h>void xytest1(){ printf(“xytest1/n”); }iii. lib/xy2.cpp 内容如下:#include <stdio.h>void xytest2(){ printf(“xytest2/n”); }iv. src/main.cpp 内容如下:#include <xy.h>main(){xytest1();xytest2();}2. autoconfa) 生成默认的 configure.in$ autoscan此时目录下生成 configure.scan$ mv configure.scan configure.inb) 编辑 configure.in (为了书写简单,去掉了所有注释)AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)AM_INIT_AUTOMAKE(xytest, 1.0) # 此处是软件名和版本号AC_PROG_CXX # 自动检测编译器AC_PROG_CCAC_PROG_LIBTOOL # 生成动态/ 静态库需要LIBTOOL AC_OUTPUT(Makefile lib/Makefile src/Makefile) # 此处是输出的文件c) 自动生成 configure$ aclocal 它是一个perl 脚本,根据configure.in 产生aclocal.m4$ libtoolize –force它会生成 libtool 所需要的工具,主要为生成库做准备$ autoconf 通过 aclocal.m4 产生 configure3. automakea) Makefile.am 项层写法,编辑 ./Makefile.am 如下AUTOMAKE_OPTIONS=foreignSUBDIRS = lib srcb) Makefile.am 编译库文件的写法,编辑 lib/Makefile.am 如下DEFAULT_INCLUDES=-I../includelib_LTLIBRARIES = libxy_la_SOURCES =xy1.cpp xy2.cppc) Makefile.am 编译开执行程序的写法,编辑src/Makefile.am 如下DEFAULT_INCLUDES=-I../includebin_PROGRAMS = mainmain_SOURCES = main.cppmain_LDADD= -L../lib/.libs/ -lxyd) 生成 Makefile.in$ automake –add-missing4.编译运行(以 arm 为示例)$ ./configure –host=arm-linux 此时机器上需要有arm-linux-gcc 系统的编译工具$ make$ make install5.总结a) 需要手动编译的只有 configure.in, Makefile.am, 和源代码三处i. Makefile.am 中的常用设置项AM_CXXFLAGS= 编译 C++ 程序时所带的 FLAGSAM_CFLAGS= 编译C 程序时所带的FLAGSDEFAULT_INCLUDES= 编译时加入的include 目录DEFS= 编译时定义的DEFIND 值b) 注意看执行过程中有无错误提示。
automake 交叉编译
automake 交叉编译摘要:1.什么是交叉编译2.自动构建工具Automake 的作用3.Automake 如何实现交叉编译4.交叉编译的优点与局限性5.结论正文:1.什么是交叉编译交叉编译是指在开发环境中,使用一种处理器架构的编译器来编译另一种处理器架构的可执行文件。
这种编译方式可以让开发者使用自己熟悉的开发环境,同时为不同的硬件平台生成可执行文件。
交叉编译的例子包括在x86 架构的Linux 系统上编译ARM 架构的Linux 内核,或者在Windows 系统上编译Linux 应用程序等。
2.自动构建工具Automake 的作用Automake 是一个用于自动构建软件的工具,它可以根据源代码和配置文件生成Makefile。
Makefile 是一个用于构建软件的脚本,它告诉编译器如何编译源代码,以及如何链接目标文件和库。
Automake 通过简化Makefile 的生成过程,提高了软件开发的效率。
3.Automake 如何实现交叉编译Automake 支持交叉编译的方式,它使用ac_cross_compile 变量来指定交叉编译的工具链。
在构建过程中,Automake 会自动检测目标架构和开发环境架构的差异,然后使用指定的交叉编译工具链来编译源代码。
这使得开发者无需手动调整编译器和链接器,就可以生成适用于目标硬件平台的可执行文件。
4.交叉编译的优点与局限性交叉编译的优点在于,它可以让开发者在熟悉的环境下进行开发,同时生成适用于不同硬件平台的可执行文件。
这对于嵌入式系统开发、软件移植等场景非常有用。
然而,交叉编译也存在一定的局限性。
由于不同架构之间的指令集和ABI(应用程序二进制接口)可能不同,因此交叉编译可能会导致性能下降或程序错误。
因此,在使用交叉编译时,需要充分了解目标硬件平台的特性,并进行适当的优化。
5.结论总之,交叉编译是一种在开发环境中生成适用于目标硬件平台可执行文件的方法。
Automake 作为一个自动构建工具,可以简化交叉编译的过程,提高软件开发的效率。
使用Automake生成Makefile及动态库和静态库的创建-BriverSong...
使用Automake生成Makefile及动态库和静态库的创建-BriverSong...使用Automake生成Makefile及动态库和静态库的创建收藏使用Automake 创建和使用静态库1. 目录结构如下:view plaincopy to clipboardprint?example|——src 目录(存放源代码文件)|——hello.c|——lib 目录(存放用来生成库的文件)|——test.c 用来生成静态库libhello.a|——include 目录(存放程序中使用的头文件)|——hello.hexample|——src 目录(存放源代码文件)|——hello.c|——lib 目录(存放用来生成库的文件)|——test.c 用来生成静态库libhello.a|——include 目录(存放程序中使用的头文件)|——hello.h2. 编写的各个目录下的源文件view plaincopy to clipboardprint?hello.h 文件extern void print(char *);test.c 文件#include<stdio.h>void print(char *msg){print(“%s\n”, msg);}hello.c 文件#include “hello.h”int main(){print(“Hello static library!”);//这里用到的是静态库中的函数return 0;}hello.h 文件extern void print(char *);test.c 文件#include<stdio.h>void print(char *msg){print(“%s\n”, msg);}hello.c 文件#include “hello.h”int main(){print(“Hello static library!”);//这里用到的是静态库中的函数return 0;}3. 编写lib/Makefile.am 文件view plaincopy to clipboardprint?noinst_LIBRARIES=libhello.alibhello_a_SOURCES=test.cAUTOMAKE_OPTIONS=foreignnoinst_LIBRARIES=libhello.alibhello_a_SOURCES=test.cAUTOMAKE_OPTIONS=foreign第一行noinst 表示生成的是静态库,不需要make install ,直接制定它的位置和名字就可以使用。
automake详解
Autoconf/Automake工具组主要包括autoconf、automake、perl语言环境和m4。其中FC4默认安装的autoconf和automake软件包信息如下:
[root@localhost hello]# rpm -qa |grep autoconf //查看是否安装autoconf
使用Autoconf/Automake工具自动生成Makefile文件的流程图如图2-5所示。在此过程中使用的命令主要有aclocal、autoscan、autoconf、autoheader和automake。由图可知运行步骤如下:
(点击查看大图)图2-5自动创建Makefile文件流程
(1)创建源代码文件,使用"autoscan"生成configure.scan文件,将其重命名为configure.ac,并做适当修改,然后使用"aclocal"命令生成aclocal.m4文件,使用"autoconf"命令由configure.ac和aclocal.m4文件生成configure文件。
AC_PREREQ(2.59)
AC_INIT(hello,1.0,yangzongde@) //在此行内容中设置当前软件包信息
AM_INIT_AUTOMAKE(hello,1.0) //automake所必备的宏,必须添加
AC_CONFIG_SRCDIR([hello.c]) //源文件名
autoscan.log configure.ac configure.scan hello.c
[root@localhost hello]# cat configure.ac
automake简介
在Linux系统下开发一个较大的项目,完全手动建立Makefile是一件费力而又容易出错的工作。
autotools系列工具只需用户输入简单的目标文件、依赖文件、文件目录等就可以比较轻松地生成Makefile了。
这极大地简化了Makefile的编写和维护,作者也是刚体验到其威力,所以将其过程记录下来。
本文以一个简单的hello.c文件进行验证。
准备工作首先需要安装autotools系列工具,包括aclocal、autoscan、automake、autoheader、autoconf等。
如果在centos或redhat系统下可以通过rpm –qa | grep auto来查看各个应用程序,如果没有,直接yum install automake即可安装。
大致流程view sourceprint?1.autoscan #扫面当前目录、源文件,生成configure.scan文件2.aclocal #根据configure.in生成aclocal.m4文件以及autom4te.cache文件夹3.autoconf #根据configure.in和aclocal.m4来产生configure文件4.autoheader #生成配置头文件的模板config.h.in5.touch README NEWS AUTHORS ChangeLog #生成一些声明性文件6.automake --add-missing #生成Makefiel.in和所需要的脚本view sourceprint?1.make2.make install3.make clean4.make dist #制作发布的软件包5.make distcheck #检验完整性并制作软件包详细步骤1. autoscan将生成configure.scan和autoscan.log文件,它会在给定目录及其子目录树中检查源文件,若没有给定目录,就在当前目录及其子目录树中进行检查。
linux自由软件安装.config,make的理解
linux⾃由软件安装.config,make的理解在linux系统中安装软件的其中⼀种:源码安装的⽅法是,先输⼊./configure,然后输⼊make,最后make install。
或许有⼈留意到没有,这些软件的根⽬录中开始是没有Makefile的,在执⾏了./configure后会⽣成了很多奇怪名字的⽂件.configure是⼀个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产⽣相应的makefile⽂件,Makefile 规定了⽤什么编译器、编译参数等信息。
从⽽可以使你的源代码能在不同的操作系统平台上被编译出来。
⽐如它会检测你是不是有CC或GCC。
可以通过在 configure 后加上参数来对安装进⾏控制,⽐如代码:./configure --prefix=/usr上⾯的意思是将该软件安装在 /usr 下⾯,执⾏⽂件就会安装在 /usr/bin (⽽不是默认的 /usr/local/bin),资源⽂件就会安装在 /usr/share(⽽不是默认的/usr/local/share.如果你安装时候指定的路径为:--prefix=/usr/local/XXX,那么卸载的时候只需要把XXX这个⽂件夹删除即可,因为该软件安装的所有⽂件都是放置在XXX这个⽂件夹。
但如果你进⾏源码包安装的时候没有指定位置(默认值⼀般为/usr/local/),或指定的位置为--prefix=/usr/local,则这时候你安装软件⽣成的⽂件将分别存储在/usr/local/⾥⾯的bin、lib或ect等⽬录中,这时候卸载起来就相对⿇烦⼀点了。
可以通过 ./configure --help 察看详细的各个参数的说明。
make install是⽤来安装的,它也从Makefile中读取指令,安装到指定的位置。
这条命令来进⾏安装(当然有些软件需要先运⾏ make check 或 make test来进⾏⼀些测试),这⼀步⼀般需要你有 root 权限(因为要向系统写⼊⽂件),以通常得⽤ sudo make install。
图解aclocal、autoconf、automake、autoheader、configure
图解aclocal、autoconf、automake、autoheader、configure1.autoscan (autoconf): 扫描源代码以搜寻普通的可移植性问题,⽐如检查编译器,库,头⽂件等,⽣成⽂件configure.scan,它是configure.ac的⼀个雏形。
2.aclocal (automake):根据已经安装的宏,⽤户定义宏和acinclude.m4⽂件中的宏将configure.ac⽂件所需要的宏集中定义到⽂件 aclocal.m4中。
aclocal是⼀个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.acuser input files optional input process output files================ ============== ======= ============acinclude.m4 - - - - -.V.-------,configure.ac ------------------------>|aclocal|{user macro files} ->| |------> aclocal.m4`-------'3.autoheader(autoconf): 根据configure.ac中的某些宏,⽐如cpp宏定义,运⾏m4,声称config.h.inuser input files optional input process output files================ ============== ======= ============aclocal.m4 - - - - - - - .|V.----------,configure.ac ----------------------->|autoheader|----> autoconfig.h.in`----------'4.automake: automake将Makefile.am中定义的结构建⽴Makefile.in,然后configure脚本将⽣成的Makefile.in⽂件转换为Makefile。
Linux下autoconf和automake使用
作为Linux下的程序开发人员,一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便。
一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了. 在本文中,将介绍如何使用autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用“./configure”,“make”,“make instal”就可以把程序安装到Linux系统中去了。
这将特别适合想做开放源代码软件的程序开发人员,又或如果你只是自己写些小的Toy程序,那么这个文章对你也会有很大的帮助。
一、Makefile介绍Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中纪录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。
Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。
当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。
Makefile的基本结构不是很复杂,但当一个程序开发人员开始写Makefile时,经常会怀疑自己写的是否符合惯例,而且自己写的Makefile经常和自己的开发环境相关联,当系统环境变量或路径发生了变化后,Makefile可能还要跟着修改。
这样就造成了手工书写Makefile的诸多问题,automake恰好能很好地帮助我们解决这些问题。
使用automake,程序开发人员只需要写一些简单的含有预定义宏的文件,由autoconf根据一个宏文件生成configure,由automake根据另一个宏文件生成Makefile.in,再使用configure依据Makefile.in来生成一个符合惯例的Makefile。
