用autotools生成Makefile的使用步骤

用autotools生成Makefile的使用步骤

示例中采用的文件和目录结构:

项目主目录project/下:
main.c
inc/
src/

inc/目录下:
file.h

src/目录下:
file1.c
file2.c
file3.c
file4.c

以下分生成静态库和生成动态库两种情况进行说明

一、生成静态库

1> 在主目录 project/ 下新建 automake 必需的配置文件 Makefile.am 文件,内容如下:

#指示 automake 代码级别,默认级别为 gnu , GNU 规定自由软件发布必需
# NEWS/README/AUTHORS/ChangeLog
# 这些说明文件,这里将级别降为 foreign ,从而避免准备这些文件.
AUTOMAKE_OPTIONS = foreign

#指定需要处理的子目录,如果要处理多个子目录,以空格隔开.这里只有 src inc
SUBDIRS = src inc

#利用 pwd 取得当前路径
ROOT_DIR = $(shell pwd)

#指定头文件所在路径,并导出供子目录 Makefile.am 使用
INCLUDES = -I$(ROOT_DIR)/inc
export INCLUDES

#指定要产生的执行文件名,这里是 cal,根据实际需要取名
bin_PROGRAMS = cal

#指定产生可执行文件需要的源文件,如果有多个,以空格隔开.这里只有 main.c ,
#注意前缀是可执行文件名,应与上面指定的文件名 cal 保持一致
cal_SOURCES = main.c

#增加可执行文件的链接库,这里会在 src/ 目录下生成静态链接库 libfiles.a
#注意前缀是可执行文件名,应与上面指定的文件名 cal 保持一致
cal_LDADD = $(ROOT_DIR)/src/libfiles.a


2> 在 src/ 子目录下新建 automake 必需的配置文件 Makefile.am 文件,内容如下:

#在src子目录生成静态库 libfiles.a ,以便顶层目录主文件链接使用
noinst_LIBRARIES = libfiles.a

#产生静态库 libfiles.a 需要的源文件,以空格隔开
#注意前前缀是静态库文件名加下划线(_),应与前面的命名保持一致
libfiles_a_SOURCES = file1.c file2.c file3.c file4.c


3> 在 inc/ 子目录下新建 automake 必需的配置文件 Makefile.am 文件,内容如下:

# EXTRA_DIST 表示用来定义要额外打包的文件名称,即头文件名
EXTRA_DIST = file.h

4> 在主目录下执行 autoscan ,生成 configure.scan 文件,将其改名为 configure.in ,并进行以下修改

#修改 AC_INIT 宏,指定软件包名称/版本/bug报告地址
AC_INIT(jacky_files, 1.0, jackyzhan@https://www.360docs.net/doc/114530129.html,)

#屏蔽 AC_CONFIG_HEADER 宏
#AC_CONFIG_HEADER([config.h])

#加入automake必需的宏AM_INIT_AUTOMAKE
AM_INIT_AUTOMAKE(jacky_files,1.0)

#由于我们将要把 src 目录内的源文件编译成静态库,需要加入 AC_PROG_RANLIB 宏
#否则不用加入这个宏
AC_PROG_RANLIB(libfiles.a)


5> 在主目录下执行 aclocal ,为 autoconf 产生处理本地宏的 aclocal.m4 文件


6> 在主目录下执行 autoconf ,生成配置文件 configure 文件


7> 在主目录下执行 automake --add-missing ,会在各级目录下生成 Makefile

.in 文件。
--add-missing 选项会自动添加一些必要的脚本


8> 在主目录下执行 ./configure ,会在各级目录下生成 Makefile 文件。
它是读入各级目录下的 Makefile.in 文件生成 Makefile 文件的。




二、生成动态库

autotool 制作动态库流程与制作静态库流程大体一致,其中区别如下:

configure.in 文件中:
用 AC_PROG_LIBTOOL 宏替换 AC_PROG_RANLIB ,
表示利用 libtool 来自动生成动态库

主目录 Makefile.am 文件中:
cal_LDADD = $(ROOT_DIR)/src/libfiles.a
改为:
cal_LDADD = $(ROOT_DIR)/src/https://www.360docs.net/doc/114530129.html,

src/Makefile.am 文件中:
noinst_LIBRARIES = libfiles.a
libfiles_a_SOURCES = file1.c file2.c file3.c file4.c
改为:
lib_LTLIBRARIES = https://www.360docs.net/doc/114530129.html,
libfiles_la_SOURCES = file1.c file2.c file3.c file4.c

autoconf 之前,首先执行 libtoolize -f -c 生成制作动态库必要的文件




三、使用Makefile

make
执行编译,产生可执行文件 cal
automake 默认的 gcc 编译选项为 -Wall -O2 -g ,怎么改为我们实际需要的编译选项?
使用如下命令重新 configure :
CFLAGS="-Wall -g" ./configure
当然也可以直接在顶层 Makefile.am 文件中添加 CFLAGS = "-Wall -g"

make install
将可执行文件 cal 安装到系统目录

make clean
清除前一次编译的目标文件(.o), 库文件(.a),可执行文件

make distclean
除了执行 make clean 的工作外,还会清除 ./x 过程生成的文件

make dist
将源程序和相关文档打包成一个压缩文档以供发布


相关文档
最新文档