在Linux系统下开发时总苦恼于工程的管理,单个工程的源文件数大于50之后必然要考虑把其中比较通用的部分整理、抽象成为库。这样一个项目就由多个子工程组成,这是一种比较理想的管理方式。因为通讯工具及使用习惯的原因,日常工作都在windows上进行,此时在linux上开发则通过远程客户端进行。客户端虽然可以使用文字终端或者图形界面终端,但在某些情形下,就需要手工完成一堆源码的编译工作。例如本人目前正在进行的将单一工程内的若干源文件抽取整理为动态库的需要,此工作涉及到的文件数未必很多,若以纯手工方式书写makefile文件未尝不可,只是规则太多,而且文件间的依赖关联一时没有记清楚则整个工程处理起来费时费力。
一个快速处理此类要求的办法是使用autoconf,automake的auto族系列工具。以一个实例为准,将操作步骤记录下来。
1. 建文件夹。
Mkdir libScan/src
2. 复制文件。
将需要编译成库的文件抽取出来复制至libScan/src。
3. 运行autoscan命令。
在libScan的上级目录运行autoscan libScan/src;
出现文件libScan/configure.scan;
Mv configure.scan configure.in
4. 修改configure.in
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_INIT(configure.in) //改
AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE(libScanLuo.so, 0.1) //加
AC_LANG_CPLUSPLUS //加
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
AM_PROG_LIBTOOL
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_CONST
AC_TYPE_SIZE_T
# Checks for library functions.
AC_FUNC_CLOSEDIR_VOID
AC_HEADER_STDC
AC_FUNC_STAT
AC_CHECK_FUNCS([getcwd memset strchr strrchr])
AC_OUTPUT(Makefile src/Makefile) //改,符合deep模式
5. 生成Makefile.am文件。
此文件生成目录如下:libScan/Makefile.am,libScan/src/Makefile.am。
其中前者内容:
AUTOMAKE_OPTIONS = foreign 1.4
SUBDIRS = src
后者内容:
lib_LTLIBRARIES = libScanluo.la
libScanluo_la_SOURCES =CLXE_File.cpp CLXE_ScanImpl.h ILXE_ScanBase.cpp tagScanParam.h /
CLXE_DiskScan.cpp CLXE_File.h ILXE_ScanBase.h CLXE_DiskScan.h /
CLXE_ScanImpl.cpp tagSfileinfo.h GeneralUtil.cpp GeneralUtil.h CLXEBaseObj.cpp /
CLXEBaseObj.h CLXEObjManager.cpp CLXEObjManager.h ILXE_ManageBase.h
libScanluo_la_LDFLAGS = -lACE
很简单的编辑这两个文件,在命令行下用VIM就行,不会很费劲。
6. 运行autoheader
7. 运行automake –a
8. 运行./configure
9. 运行make
10. 查看成果吧。