资源导航>技术博文>操作系统|Linux>Autotools工具制作Makefile
我的收藏我的下载上传积分

Autotools工具制作Makefile

评分


●现在Linux上的软件开发所用的Makefile一般都用autotools来制作的。autotoos主要包含aclocal、autoscan、autoconf、autoheader、automake等工具,利用autotools生成Makefile的步骤如下:
 ①.编辑/创建configure.in(先通过autoscan工具生成configure.scan模板文件)
 ②.编辑/创建Makefile.am
 ③.运行aclocal
 ④.运行autoconf
 ⑤.运行autoheader
 ⑥.运行automake --add-missing
 ⑦.运行./configure CC arm-linux-gcc --host=arm-linux
注:
 (1)autoscan用于生成configure.scan模板文件,用户要将其更名为configure.in(或configure.ac)才能被autoconf识别。
 (2)autoconf用于读取configure.in文件,根据其内容生成configure脚本程序。
 (3)autoheader根据configure.in文件生成config.h.in。
 (4)automake用于读取configure.in中关联的各个子目录下的Makefile.am来产生相应的Makefile.in文件;
 (5)configure脚本实现的功能是通过调用autotools提供的一系列工具命令来读取所有相关的Makefile.in文件并汇总生成一个Makefile文件。
 (6)后来发现可以直接用autoreconf -fvi命令直接把上面操作都执行一遍,或者写个批处理脚本来执行。

●是否修改完代码后都要调用一系列步骤的autotools命令来重新生成Makefile?
只有第一次生成Makefile需要上述步骤,在之后在软件开发过程中,只要更新configure.in与Makefile.am文件,然后直接Make就行。
其Makefile脚本支持自动会检查configure.in与Makefile.am文件的时间戳,如果发现有更新,自动会进行调用相关的autotools工具进行处理。
并且,第一次执行configure脚本时通过命令行传入的参数(如交叉编译器参数)会自动进入Makefile文件,以后再Make时参数不会丢。
只要Makefile没丢,每次修改完configure.in或Makefile.am,只要重新Make一下就行,如果Makefile丢了,就要通过执行configure脚本程序来重新生成Makefile;
如果configure脚本也丢了,那必须调用autoconf来生成configure脚本,或者从新走下流程,即依次执行alcocal->autoconf->autoheader->automake->configure。

●autotools所生成的makefile的功能
具有的功能包括:make、make install、make uninstall、make clean、make distclean、make dist。
①、键入make默认执行make all。其目标体为all。
②、make install/uninstall
③、make clean
    #注:清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。
④  make distclean
    #make distclean类似make clean,但同时也将configure生成的全部文件删除掉,包括Makefile,但不删除make dist生成的发布包。
⑤、make dist
   #产生发布软件包文件(即distribution package),这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。它会在当前目录下生成一个名字类似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.in中定义的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。
 
●使用autotools管理一个代码工程项目时,用户需要维护configure.in和Makefile.am这两个文件。configure.in用于指定项目的全局属性并指定相关Makefile.am的路径;Makefile.am主要用于添加项目相关的每一个源文件的文件名路径,用户不需要添加涉及的头文件,如果使用的头文件不在默认搜索路径上,则要在Makefile.am中指定头文件所在的目录。如果需要用到的.c/.c++源码文件分散在不同的子目录中,通常的做法是在每个源码目录下都建立并维护一个Makefile.am文件,每个Makefile.am文件用于指出当前目录下哪些源文件及库文件需要编译进来,当然也可以添加其他目录中的源文件或库,并可以在Makefile.am中指定头文件的搜索路径。通过一个configure.in与多个Makefile.am文件的关联,可以将所有相关的源码文件都关联到一个工程项目中。每个Makefile.am文件都会相应生成一个Makefile.in和一个Makefile文件。


●autotools命名习惯:
ac后缀文件是autoconf的输入文件;
am后缀文件是automake的输入文件;
in后缀文件是configure的输入文件;

●configure.in文件规则说明

ΔMakefile.am举例(#开头的是注释行):
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃AC_PREREQ(2.59)                      # 声明本文档要求的autoconf的最低版本,本例为2.59;
┃AC_INIT(mingui ,1.5, ming@cmsoft.cn) #定义软件包名称,版本信息及作者邮箱地址等;
┃AM_INIT_AUTOMAKE(mingui,1.5)         #需要手动添加的automake所必备的宏,参数为软件包名称及版本号;
┃AC_CONFIG_SRCDIR([mtest.c])          #用来侦测所指定的源码文件是否存在,来确定源码目录的有效性;
┃AC_CONFIG_HEADER([config.h])         #用于生成config.h文件,以便autoheader使用,默认不必修改;
┃# Checks for libraries.
┃AC_PROG_RANLIB                       #如果要使用库文件,别忘了要给configure.ac/in中加入该宏定义;
┃AC_CHECK_LIB([pthread], [pthread_create]) #如果要使用pthread,则要加入该语句;
┃...
┃AC_OUTPUT([Makefile] [src/drv/Makefile])  #列出所有要生成Makefile的路径(该路径下要包含Makefile.am输入文件)
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
注:AC_INIT宏中有定义软件包名称(PACKAGE)及版本号(VERSION),而AM_INIT_AUTOMAKE宏也有对软件包的PACKAGE及VERSION的定义。
两者不冲突:如果两者都定义了,则以AM_INIT_AUTOMAKE宏的定义为准,如果AM_INIT_AUTOMAKE省略了PACKAGE及VERSION参数,则自动引用AC_INIT中的定义。如果AC_INIT与AM_INIT_AUTOMAKE都省略了参数,则会在编译时报错。执行make dist生成的软件发布包会自动以类似“PACKAGE-VERSION.tar.gz”方式命名,但这个文件名不是指编译生成的可执行文件或静态库文件名称,而是在Makefile.am中通过bin_PROGRAMS来定义编译生成的可执行文件名,或通过lib_LIBRARIES定义编译生成的静态库文件名。


●Makefile.am文件规则说明
Makefile.am主要有两种,一种是可行文件,另一种是静/动态链接库。
Δ可执行文件的Makefile.am举例:
AUTOMAKE_OPTIONS=foreign               #设置automake的软件等级,foreign表示只检测必要文件,只要顶层目录下的Makefile.am作此设置。
bin_PROGRAMS     = demoApp            #指定可执行文件名为demoApp,如果不要安装,则用noinst_PROGRAMS代替。
demoApp_SOURCES  = src/str.c test/t1.c #列出所有相关的源文件
demoApp_LDADD    = ../lib/libDemo.a    #添加编译链接时需要的库文件或目标文件(.o/.a/.so)
demoApp_LDFLAGS  = -L$(top_srcdir)/src/lib  #定义库文件的搜索路径
demoApp_CPPFLAGS = -I include          #定义局部的头文件搜索路径(仅对demoApp_SOURCES列出的源文件有效)
LDADD        =   ../lib/libDemo.a      #添加全局的动态或静态库文件
LIBS         =   -lpthread             #添加全局的库文件(与LDADD的定义方式不同),也可以在configure.in的AC_CHECK_LIB参数中指定.
LDFLAGS      =   -L$(top_srcdir)/src/lib #定义全局的库文件搜索路径
INCLUDES     = -I kernel/ -I ../gal/   #定义全局的头文件搜索路径(对当前文件有效),通过export INCLUDES使对其它文件有效。
EXTRA_DIST   = lib/data                #在调用make dist发布包时,自动将其他指定的文件打包。
SUBDIRS      = dir1 dir2               #要递归处理哪些子目录;
Δ静态库文件的Makefile.am举例:
lib_LIBRARIES    = libDemo.a     #如果不要安装,则用noinst_LIBRARIES代替lib_LIBRARIES;
libDemo_a_SOURCES     = src/str.c test/t1.c   #注意,“.”“-”等符号都要改成“_”才能作为_SOURCES前缀。
libDemo_a_LDFLAGS = -static           #指定编译成静态库(默认方式)

Δ动态库文件的Makefile.am举例:
lib_LIBRARIES       = libDemo.so 
libDemo_so_SOURCES  = src/str.c test/t1.c
libDemo_so_LDFLAGS  = -fPIC -shared    #指定编译成动态库
_LDFLAGS = -L $(top_srcdir)/src/lib


注:在Makefile.am中尽量使用相对路径,系统预定义了两个基本路径:
(1) $(top_srcdir) 表示工程最顶层目录,用于引用源程序。
    注:在顶层的Makefile.am中用export INCLUDES定义全局的头文件搜索路径时不能用$(top_srcdir),而应该通过以下方法:
         CURRENTPATH=$(shell /bin/pwd)         #得到当前路径
         INCLUDES=-I $(CURRENTPATH)/src/include  #预先定义编译时包含头文件的路径
         export INCLUDES                         #export到子目录
(2) $(top_builddir) 定义了生成目标文件的最顶层目录,用于引用.o等编译出的目标文件。

●由于一工程项目中的Makefile.am可能有多个,下面来总结一下Makefile.am是怎么放的:
①根目录(configure.in/ac所在的目录)必须有一个Makefile.am
②所有有需要编译的代码文件的目录下必须有一个Makefile.am
③如果一个子目录中有Makefile.am,那么必须在用它某个父目录中的Makefile.am里用SUBDIRS指定它,如SUBDIRS=dir1 dir2。


●如何实现交叉编译?
在执行configure时通过命令行指定编译器与目标主机。例如:
./configure CC arm-linux-gcc --host=arm-linux
通过CC参数指定编译器,--host是指你的交叉编译器的前缀,若你的交叉编译器是arm-linux-gcc,则--host=arm-linux。
最后生成的Makefile将使用arm-linux-gcc作为默认编译器。


  • anonymous最后发布于2011-02-14
  • 点赞举报评论收藏
用户评论:我要评论
IIS服务器错误的解决方法
◆IIS 6.0以下版本 HTTP 500内部服务器错误的解决方法(经典)IIS启动成功后,运行所有页面都出现HTTP 500内部服务器的错误, 网上千篇一律地都是一些关于修改IE设置和IWAM_MYSERVER账号密码的解决方法。一一试过后,没一个有用的解决方法。终于发现了一个很好的解决办法了,如果朋友们修改了IE的设置,修改了IWAM_MYSERVER账号密码后,IIS运行的页面还出现HTTP 500这个错误的时候,请试试下面这个方法吧:1、在“开始”-“设置”-“控制面板”-“管理工具”-“服务”中,查看Distributed Transaction Coordinator服务(即DTC)和COM +Event System服务是否启动,若没有启动,请将这两个服务都启动。另外,我的机子上又出现现一个问题,就是DTC服务无法启动,这时候就在cmd窗口中先后执行下列两条命令:(1)、msdtc -resetlog(2)、net start msdtc执行完这两条语句后,DTC就能启动成功了。2、执行完上述操作后,接下来就在cmd窗口中再先后执行以下三条命令:(1)、cd %windir%\system32\
资源类型:技术博文资源大小:0B资源积分:0分上传者:mingo上传时间:2019-12-08
Windows下通过Putty建立SSH隧道代理上网
要实现代理上网,前提条件肯定是需要准备一台可以连接外网的代理服务器或者VPS,并安装有SSH服务。这样,我们在本地PC的Windows客户端,就可以通过putty建立客户端与代理服务器的SSH隧道,实现代理上网。具体步骤如下:(1) 打开Putty进行配置首先,进入Putty的Connection->SSH->Tunnels面板,将目标设置为Dynamic+Auto,添加一个自定义代理端口,本例中设置代理端口为1080,点击Add,一个动态转发端口D1080就出现在上面的列表框中。 接着,将putty切换到Session面板,输入自己的代理服务器地址,port填SSH服务端口(默认22),连接类型选择SSH。随便设置一个存档名字,并点击保存按钮。 最后,点击Open按钮,连接代理服务器。在弹出的putty终端窗口中,输入SSH的登录用户名密码,一旦登录成功,SSH隧道也随即建立成功。代理上网期间,终端窗口不能关闭,一旦关闭,SSH隧道也会自动关闭。(2)本地浏览器代理设置   以FireFox为例。可以通过安装配置SwitchyOmega插件,或者直接打开F
资源类型:技术博文资源大小:0B资源积分:10分上传者:anonymous上传时间:2004-08-06
CMake编译工具学习笔记
●CMake vs Autotools首先,拿他们对比本身没有太多的意义,他们都是产生makefile文件的工程编译管理工具。CMake产生的晚,解决了很多autotools工具的问题。autotools是一个工具集具有强大的灵活性,但是因为步骤太多,配置繁琐,产生了很多的替代方案,cmake是其中最优秀的之一。早期没有那么多选项,大量的开源项目都是采用autotools管理工程。●CMake管理一个程序项目,实际上就是在源码根目录中建立一个CMakeLists.txt文件作为根节点,再通过add_subdirectory(subdir)包含其下级源码子目录,而下级源码目录中的CMakeLists.txt进一步通过add_subdirectory(subdir)包含其下级源码目录,最终把所有源码都串接在一起,同时所有的CMakeLists.txt文件也都串接在一起。另外,每一个CMakeLists.txt都要求通过include_directories来为当前文件夹下的源码设置头文件搜索路径。对于多个源码子目录(多个CMakeLists.txt)的项目,任意指定其中一个源码目配置为编译成可执行文件,其他源码目
资源类型:技术博文资源大小:0B资源积分:0分上传者:anonymous上传时间:2011-02-13
广告
广告位
了解详情
广告
广告位
了解详情
©版权所有: 南京云想物联网科技有限公司   苏ICP备20013807号     联系我们