• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: 小 中 大 | 推荐给好友 上一篇 | 下一篇

automake 小回顾

发布: 2007-7-04 12:06 | 作者: admin | 来源:  网友评论 | 查看: 9次 | 进入软件测试论坛讨论

领测软件测试网

现在google Makefile 和 automake就能找到一些文章。以一个Hello 程序描述为一个project生成Makefile的过程。

这个例子其实在 Info automake 里能看到。大家把它翻成中文的,不错。

但实际上按照这个例子来做的话,步骤都对,就是太简单,一些常用的设置需要写进去,但是没有提到,还是要自己info , google ,try .

下面是我对Automake一个小总结。

现在google Makefile 和 automake就能找到一些文章。以一个Hello 程序描述为一个project生成Makefile的过程。

这个例子其实在 Info automake 里能看到。大家把它翻成中文的,不错。

但实际上按照这个例子来做的话,步骤都对,就是太简单,一些常用的设置需要写进去,但是没有提到,还是要自己info , google ,try .

下面是我对Automake一个小总结。

1  步骤总述

   (1) autoscan 生成configure.scan .

   (2) 在configure.scan基础上手动编辑,主要要添加的 :

         AM_INIT_AUTOMAKE(myprojectname , version)

         AC_OUTPUT( 最后要生成的Makefile , 包括 子目录中的,中间用空格隔开) , 例如 AC_OUTPUT(Makefile  subdir/Makefile

subdir1/Makefile)
 
  AC_PROG_RANLIB (意义见第四条末尾)

   (3) aclocal

        autoconf 

                   生成configure脚本。

   (4) 这步我基本靠手,呵呵,有没有脚本来完成这个的?就是在每个最后需要生成Makefile的目录中,写一个Makefile.am .

        最上层的要写明

        AUTOMAKE_OPTIONS = foreign
 
 如果这个目录没有要编译的文件 ,只包含了子目录,则只写个

        SUBDIRS  = dir1   
 
 就ok了。
 例如我的工程,最上层只是包含了源码目录,于是就写了
 AUTOMAKE_OPTIONS=foreign
 SUBDIRS=src
 

        如果有文件要编译,则要指明target 先。比如我的src目录底下既有文件,又有目录,而src的这层目录中的文件最后是要编译成一个

可执行文件,则src目录下的Makefile.am这么写。

 bin_PROGRAMS= myprogram
 SUBDIRS= sub1

  myprogram_SOURCES= \
     a.cpp\
   b.cpp\
 # 要编译的源文件。这儿的_SOURCES是关键字 
 EXTRA_DIST= \
  a.h \
  b.h
 # 不用编成.o,但生成target myprogram也需要给编译器处理的头文件放这里

        myprogram_LDADD = libsub1.a 这个_LDADD是关键字,
 # 最后生成myprogram这个执行文件,还要link src/sub1这个目录中的内容编成的一个lib :libsub1.a,
 
 myprogram_LDFLAGS = -lpthread -lglib-2.0 -L/usr/bin $(all_libraries)
 # myprogram还要link系统中的动态so,以此类推,需要连自编译的so,也写到这个关键字 _LDFLAGS后面就好了。
  
 AM_CXXFLAGS = -D_LINUX
 # 传递给g++编译器的一些编译宏定义,选项,

 INCLUDES=-IPassport -Isub1/ -I/usr/include/glib-2.0\
    -I/usr/lib/glib-2.0/include $(all_includes)
 #  传递给编译器的头文件路径。


 下面是sub1种生成lib的Makefile.am

 noinst_LIBRARIES = libprotocol.a
 # 不是生成可执行文件,而是静态库,target用noinst_LIBRARIES
 libprotocol_a_SOURCES = \
  alib.cpp
 EXTRA_DIST = mylib.h\
   alib.h
 INCLUDES= -I../ $(all_includes)
 AM_CXXFLAGS = -D_LINUX -DONLY_EPOLL -D_SERVER
 

 ok ,最后补上AC_PROG_RANLIB涵义,如果要自己生成lib,然后link到最终的可执行文件中,则要加上这个宏,否则不用。

2   一点讨论
 每个目录至少都要有一个target,或者是可执行文件或者是lib,似乎对目录的划分带来点局限。
 比如我的目录结构如果是这样
 ./Src
 ./Src/sub1
 ./Src/sub2
 而我想这样,sub1,sub2都没有target,目录划分只是为了区别代码的不同模块,然后把两个目录中编译出的中间文件一起link
 ,得到最后需要的 myprogram 。
 似乎在Src/Makefile.am中要这么写
 myprogram_SOURCES = sub1/a.cpp \
   sub2/b.cpp
 可以实现,但我没试,:P

 当然和设成先编译出libsub1.a libsub2.a 最后Link得到myprogram 没有本质区别了。

3    剩下的就是
     automake --add-missing
     Ok , Makefile.in应该放到各个目录下了。


最后,运行configure脚本,生成 各个目录下的Makefile .......
再最后 ,make .......

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:[email protected] 电话:010-51297073

软件测试 | 领测国际 | ISTQB | ISTQB官网 | TMMi | TMMi认证 | 国际软件测试工程师认证 | 领测软件测试网