使用automake工具自动构建工程

1 篇文章 0 订阅
1 篇文章 0 订阅
本文介绍了如何利用automake工具自动构建C++工程。首先,执行autoscan和aclocal生成配置文件,接着修改configure.ac,添加AM_INIT_AUTOMAKE字段。然后,执行autoheader、automake -a和configure来生成Makefile。对于复杂的目录结构,需要适当调整。在src目录下创建Makefile.am以编译源文件,并确保链接到fftw库。
摘要由CSDN通过智能技术生成

需要使用到的命令

autoscan命令

aclocal命令

autoconf命令

automake -a命令

使用autotools构建工程的逻辑如下所示:


安装autoconf、automake

安装成功之后进入工程目录,执行autoscan,出现两个文件autoscan.log和configure.scan

autoscan
autoscan帮助用户产生configure.scan,经过修改和检查后成为configure.ac。有时候configure.scan的中宏的顺序不对,之后autoconf的时候会产生警告,需要手动调整顺序。

手动修改configure.scan为configure.ac或者configure.in

configure.ac中常用的宏:
AC_PROG_CC ([compiler-search-list]) : Determine a C compiler to use.
AC_PROG_CPP:Set output variable CPP to a command that runs the C preprocessor.
AC_PROG_CPP_WERROR : This acts like AC_PROG_CPP, except it treats warnings from the preprocessor as errors
even if the preprocessor exit status indicates success.
AC_PROG_CXX ([compiler-search-list ]) : Determine a C++ compiler to use.
AC_PROG_CXXCPP : Set output variable CXXCPP to a command that runs the C++ preprocessor.
AC_PROG_GO ([compiler-search-list ]) [Macro] : Find the Go compiler to use.
AC_LANG (language) : Do compilation tests using the compiler, preprocessor, and fle extensions for the
specifed language.
AC_LANG_PUSH (language) : Remember the current language (as set by AC_LANG) on a stack, and then select the
language.
AC_LANG_POP ([language ]): Select the language that is saved on the top of the stack, as set by AC_LANG_PUSH,
and remove it from the stack.
AC_PREREQ宏声明本文件要求的autoconf版本,如本例使用的版本2.59。
AC_INIT宏用来定义软件的名称和版本等信息,在本例中省略了BUG-REPORT-ADDRESS,一般为作者的e-mail。
AM_INIT_AUTOMAKE是笔者另加的,它是automake所必备的宏,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。
AC_CONFIG_SRCDIR宏用来侦测所指定的源码文件是否存在,来确定源码目录的有
效性。在此处为当前目录下的hello.c。
AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。
AC_CONFIG_FILES宏用于生成相应的Makefile文件。

手动修改configure.ac的内容

AC_CONFIG_FILES([.vim/bundle/clang_complete/Makefile
                 .vim/bundle/sparkup/Makefile
                 .vim/bundle/supertab/Makefile])
这里把括号内的多余的makefile去掉

加入AM_INIT_AUTOMAKE字段,


AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])

这里修改为所需的包名,版本号,邮箱地址

AC_INIT([mpi_test], [1.0], [BUG-REPORT-ADDRESS@qq.com])
完整的configure.ac的内容如下:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([mpi_test], [1.0], [BUG-REPORT-ADDRESS@qq.com])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([H_U_VW_Vp.cpp])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX([mpicxx])
AC_PROG_CC(mpicc)
AC_PROG_INSTALL
AC_PROG_LN_S

# Checks for libraries.

# Checks for header files.
AC_CHECK_HEADERS([limits.h stddef.h stdint.h stdlib.h string.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_CHECK_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_SIZE_T

# Checks for library functions.
AC_CHECK_FUNCS([memset pow])

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

手动创建Makefile.am

Makefile.am的内容如下:
bin_PROGRAMS=mpiwaste
mpiwaste_SOURCES=DataTran.cpp h_Coord.cpp Inside.cpp Partition.cpp TDFWI.cpp testTDFWI.cpp H_Border.cpp H_U_VW_Vp.cpp RWsgy.cpp testmain.cpp
mpiwaste_CXXFLAGS=-std=c++11


执行automake --add-missing之前先执行autoheader然后会出现config.h.in文件

手动创建这几个缺失的文件

INSTALL安装描述。你可以从其他基于automake的应用中拷贝一个标准的INSTALL文件,然后添加一些针对你的应用的信息。
README用户应该知道的一些关于本应用的信息。最好在文件的开始处简单描述一些这个应用的目的
AUTHORS作者列表。
NEWS关于本应用的最新的新闻
ChangLog本应用的修订历史

再次执行automake -a,成功后会出现configure可执行脚本,执行configure,

configure会隐式调用config.status,configure负责检查系统,config.status负责实例化文件。如下:

成功后会出现Makefile,然后执行make或者make install即可。

这个例子中工程使用的源文件和头文件在一个目录下,如果目录结构复杂一些还要做修改,

比如下面功臣的目录结构:

├── build
├── createmake.sh
├── data
│   ├── InitVp-3D.sgy
│   ├── newdata
│   │   ├── InitVp-3D.sgy
│   │   └── TrueVp-3D.sgy
│   └── TrueVp-3D.sgy
├── include
│   ├── common.h
│   ├── const_value.h
│   ├── DataTran.h
│   ├── Partition.h
│   ├── RWsgy.h
│   └── testHFWI3D.h
├── main.cpp
├── Makefile.back
├── mpd.hosts
├── result
│   ├── CalGrad
│   ├── CalGrad_comu_
│   ├── CalStepLength
│   ├── CalStepLength_comu_
│   ├── CalTrueWF
│   ├── CalTrueWF_comu_
│   ├── PreProcess_comu_
│   ├── read_time
│   └── Total_time
├── run.sh
├── series.sh
├── src
│   ├── DataTran.cpp
│   ├── H_Border.cpp
│   ├── h_Coord.cpp
│   ├── Inside.cpp
│   ├── Makefile.am
│   ├── Makefile.back
│   ├── Makefile.in
│   ├── Partition.cpp
│   ├── RWsgy.cpp
│   └── testHFWI3D.cpp
└── test.sh

src中保存的是源文件.cpp,result中保存的运行结果,include包含头文件,data中是初始数据。

configure文件做如下修改;

在src中也应该产生一个Makefile

AC_OUTPUT([Makefile
		src/Makefile])

用到了fftw库,

AC_CHECK_LIB([fftw3], [main])


top目录的Makefile.am

bin_PROGRAMS=3D_FDTD
3D_FDTD_SOURCES=main.cpp
3D_FDTD_LDFLAGS=-lfftw3
TOPPATH=$(shell /bin/pwd)
CURRENTPATH=$(shell /bin/pwd)
INCLUDES=-I$(TOPPATH)/include
export TOPPATH
export INCLUDES
SUBDIRS=src
LDADD=$(TOPPATH)/src/libutil.a


src目录下的Makefile.am

noinst_LIBRARIES=libutil.a
libutil_a_SOURCES=DataTran.cpp  H_Border.cpp  h_Coord.cpp  Inside.cpp  Partition.cpp  RWsgy.cpp  testHFWI3D.cpp
#libutil_a_SOURCES=$(UTILSOURCES)







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值