GNU-autotools使用实例(详解)

本文详细介绍了如何使用GNU Autotools来构建软件项目,包括顶级目录、lib子目录和src子目录的Makefile配置,以及configure.ac文件的修改与重命名。在lib子目录中,配置了静态库libaname.a的生成和安装,而在src子目录中,配置了可执行文件main的编译与链接。此外,还讨论了configure.ac文件中初始化autoconf、探测系统配置和生成子Makefile的相关步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

├── include
│   ├── main_tmp.h
│   ├── maze.h
│   └── stack.h
├── lib
│   ├── Makefile.am
│   ├── maze.c
│   └── stack.c
├── Makefile.am
└── src
    ├── main.c
    └── Makefile.am

3个makefile.am详解

1)顶级目录下

# Makefile.am
SUBDIRS = lib src
include_HEADERS = include/main_tmp.h include/maze.h include/stack.h
SUBDIRS 用以说明需要在 lib 和 src 两个目录下产生 Makefile,所以 这两个目录下也有makefile.am
include_HEADERS 用以说明 include/head.h 在将来执行 make install 的时候将会被安装到 include 目录中。

2)lib子目录下

# lib/Makefile.am
lib_LIBRARIES = libaname.a
libaname_a_SOURCES = maze.c stack.c
libaname_a_CPPFLAGS = -I../include
AM_V_AR = ar
RANLIB = ranlib
lib_LIBRARIES 中的 lib 代表将来执行 make install 时, libaname.a 将会被安装到 lib目录下 ,后面的LIBRARIES 代表产生的 libaname.a 是一个静态库文件
libaname_a_SOURCES 代表 libaname.a 所以来的源文件列表
libaname_a_CPPFLAGS代表编译参数,指定所需要头文件目录
AM_V_AR 指定把目标文件打包成静态库,使用ar
RANLIB指定为静态库创建索引,使用ranlib

3)src子目录下

# src/Makefile.am
bin_PROGRAMS = main
main_SOURCES = main.c main_tmp.h maze.h stack.h maze.c stack.c
main_CPPFLAGS = -I$(srcdir)/../include
main_LDADD = $(srcdir)/../lib/libaname.a
main_LDFLAGS = -L$(srcdir)/../lib -laname
bin_PROGRAMS 中的 bin 代表将来执行 make install 时, main 将会被安装到 bin目录下
main_SOURCES 代表 main 所依赖的源文件列表
main_CPPFLAGS 代表编译产生 main 时的预处理器选项,该例子中因为 main.c 需要包含头文件,因此用-I 来给预处理器指定头文件所在路径
main_LDADD 代表链接的库
main_LDFLAGS 代表编译产生 main 时的链接器选项,该例子中因为 main.c 需要链接 aname 库,因此使用-L 来给链接器指定库文件所在路径。

4)修改并且重命名成configure.ac,内容如下:

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

AC_PREREQ([2.69])
AC_INIT([main], [1.0], [1228685814@qq.com])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.
# FIXME: Replace `main' with a function in `-laname':
AC_CHECK_LIB([aname], [maze])
AC_CHECK_LIB([aname], [stack])

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile
                 lib/Makefile
                 src/Makefile])
AC_OUTPUT

AM_PROG_AR
AC_PROG_RANLIB
AC_INIT用以初始化autoconf,并指明包名、版本和错误报告邮箱
AC_CONFIG_SRCDIR指定源文件所在路径
AC_CONFIG_HEADERS指定产生的配置文件名称
AC_PROG_CC用以探测当前系统的C编译器
AC_CHECK_LIB([], [])探测工程中的库文件,及其里面所包含的函数接口
AC_CONFIG_FILES用以告知autoconf本工程总共需要产生多少个子Makefile。
AC_OUTPUT是最后一个必须的宏,用以输出需要产生的文件。
静态库,还必须声明AM_PROG_ARAC_PROG_RANLIB
AM_INIT_AUTOMAKE([foreign -Wall -Werror]),foreign表示表需要.README.NEWS等文件,不加foreign,没有这些文件会报错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值