posts - 8, comments - 12, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
       在网上查了很多关于automake的文章,有几篇还是不错的,但大部分的例子都局限于helloworld这样的程序,我就把自己如何构建工程的过程写下来,只把应用记录下来,不涉及细节,以后会随着应用的深入有所更新。

      我的源代码的组织结构是通用文件放在顶层文件夹中,与平台环境相关的文件放在不同子目录中,测试系统为ubuntu 8.10。
切换到当前文件夹,输入$] : autoscan
生成一些文件,我们关注configure.scan.
$] : mv configure.scan configure.in
$] : vim configure.in
下面显示内容
 
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.61)
AC_INIT(mypro, 1.0, support@163.com)        #需要改动,主要是程序的基本信息
AC_CONFIG_SRCDIR([Thread.h])
AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE(mypro, 1.0)                  #一定要添加,名字任意取,但最好和以后填写的程序名称保持一致

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC

# Checks for libraries.

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/ioctl.h sys/socket.h syslog.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_CONST
AC_C_INLINE
AC_TYPE_SIZE_T
AC_HEADER_TIME
AC_STRUCT_TM

# Checks for library functions.
AC_FUNC_FORK
AC_PROG_GCC_TRADITIONAL
AC_FUNC_MEMCMP

AC_FUNC_SELECT_ARGTYPES
AC_FUNC_VPRINTF
AC_CHECK_FUNCS([ftruncate gethostname inet_ntoa memmove memset select socket strchr strerror strstr])

AC_OUTPUT(Makefile)                   #添加Makefile

需要改动的就是这几个地方,然后保存。
然后 $]: aclocal
如果生成m4文件则继续,否则说明configure.in有问题
$] : autoconf    目的是生成configure
$] : autoreconf --install   目的是产生生成Makefile.in的必要文件
$] : autoheader  目的是生成config.h.in
由于Makefile由Makefile.in生成,而Makefile.in由Makefile.am来填充,所以需要建立Makefile.am
$] : vim Makefile.am 需要填充的内容如下:

AUTOMAKE_OPTIONS=foreign    

bin_PROGRAMS=mypro

mypro_SOURCES=Main.cpp Device.cpp Server.cpp SocketBase.cpp Thread.cpp Posix/AsycIO.cpp Posix/PoSockDisp.cpp Posix/Daemon.cpp Posix/PoMutex.cpp

INCLUDES=-I.. -DTHIRTY_TWO_BIT

mypro_LDADD=libmylib.a -lpthread -lrt
第一行表示符合GNU Makefile标准的程度,一般用这个,其他的可以查阅相关文档。
第二行表示程序的名称,这是必须的。
第三行表示所有的源代码文件,要注意名称是 程序名+_SOURCES。
第四行中可以把查找头文件的文件夹包含进来,格式就是gcc选项的格式,还可以包含宏定义。
最后一行是需要添加或者链接的库,格式跟gcc的完全一样,这个选项只能接受有关库的参数,不接受其它参数。
保存后就可以生成Makefile.in了
$] : automake

OK !

然后你可以构建可执行程序了,./configure      make    

如果要编写静态库,那么Makefile.am的参数就有些变化
AUTOMAKE_OPTIONS=foreign
lib_LIBRARIES=libmylib.a
libmylib_a_SOURCES= .................

INCLUDES=.................
其中参数名的格式一个要正确。其他的跟可执行文件的产生一样。

      如果要产生动态库,必须要借助libtool,libtool产生.a和.so文件,放在当前文件夹.lib/目录中,这个被隐藏了,同时也产生.la文件,当其他模块需要链接库时,只需要链接.la文件,然后由.la文件来决定如何链接这个库,是静态链接还是动态链接,由configure参数决定,这样的方式据说是用来解决夸平台问题,但我似乎并没有从中受益多少,不过产生动态库的makefile也没有其他办法,不过好在.a和.so都产生了,怎么用就在于个人了。要用libtool就要在configure.in中添加宏AC_PROG_LIBTOOL,
然后可以写Makefile.am, 如下
AUTOMAKE_OPTIONS=foreign

lib_LTLIBRARIES=libmylib.la

libmylib_la_SOURCES=mylib.c

libmylib_la_LIBFLAGS=......

libmylib_la_LIBADD=.....
如果要在应用程序里链接这个库,那么就在mypro_LDADD +=libmylib.la,是动态还是静态要在configure的参数中指定。



Feedback

# re: (原)用automake来代替IDE实现工程代码编译  回复  更多评论   

2008-11-17 19:54 by LOGOS
一开始我也用你现在说的这套东西
后来我发现,自己手工写makefile,比搞这东西容易和效率多了

# re: (原)用automake来代替IDE实现工程代码编译  回复  更多评论   

2008-11-17 23:07 by 蚂蚁终结者
呵呵,没用过,看起来好像很复杂,一直用自己写的一个通用的makefile模板。有点害怕这些东西,当时看makefile的manual有阴影了。

# re: (原)用automake来代替IDE实现工程代码编译  回复  更多评论   

2008-11-18 09:24 by 饭中淹
这个有什么优势?

# re: (原)用automake来代替IDE实现工程代码编译  回复  更多评论   

2008-11-18 10:10 by ufwt
看看大部分的开源的程序全部是用autoconf就知道价值了!
automake好像是否使用还要考虑一下,autoconf绝对是有价值的!

# re: (原)用automake来代替IDE实现工程代码编译  回复  更多评论   

2008-11-18 10:26 by eyesmart
现在gnu makefile的规则变得越来越复杂了,automake应运而生,我们作为用户只需要与automake进行交互,而让automake的开发者去读gnu makefile的文档,简单的程序我们自己写简单的makefile就够了,但是随着源代码文件的增加,那么要维护你写的这个makefile就变得越来越困难和繁琐了,所以现在大部分的开源软件都是采用automake来构建的。当你在linux下编译一个开源软件时,大多都会输入./configure , make test, make , make install. 这就是用automake构建的。

# re: (原)用automake来代替IDE实现工程代码编译  回复  更多评论   

2008-11-18 10:30 by eyesmart
@LOGOS
因为你写的是简单的程序,而且程序是你自己来编译的,但是如果你参与了一个大一些的项目,而且你写的程序很可能是由其他人来build,而那个人的环境不一定和你的环境一样,那么直接make就可能出问题,但是用automake这种方式可以帮你检查环境,并用相应的参数去填充makefile

# re: (原)用automake来代替IDE实现工程代码编译  回复  更多评论   

2008-11-18 10:34 by eyesmart
@饭中淹
在linux写一些程序并build它,然后找一个开源软件build一下,你就知道了。

# re: (原)用automake来代替IDE实现工程代码编译  回复  更多评论   

2008-11-18 10:38 by eyesmart
@ufwt
autoconf和automake都属于一类程序,他们彼此协作完成任务,不能分开来讨论,autoconf只是用来生成configure脚本,而automake用来生成makefile,比如在configure.in中包含这句AM_INIT_AUTOMAKE(mypro, 1.0),那么AM就是automake的缩写,而AC_INIT(mypro, 1.0, support@163.com)中的AC就是autoconf的缩写

# re: (原)用automake来代替IDE实现工程代码编译  回复  更多评论   

2008-11-22 17:11 by darkmagician
当初想用过,不过搞了两天也搞不定。网上的资料基本都是一个hello world的c程序。而我的程序有许多文件,连接了好多库,还有复杂的stl,老是有莫名其妙的错误。
后来花了一个下午自己写了个makefile算了。。。。
如果automake步骤太多了,有个更自动化的工具就好了。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理