automake中Makefile.am和configure.ac的格式及编译过程

本文详细介绍了如何使用automake和autotool进行源码编译。首先在src目录编写Makefile.am,定义bin_PROGRAMS和AM_CFLAGS。接着通过ACLOCAL_AMFLAGS配置libtoolize。执行libtoolize、aclocal、autoconf和automake生成configure及相关文件。最后通过./configure和make安装可执行文件到./bin/。
部署运行你感兴趣的模型镜像

(一)写Makefile.am

当写完代码之后,在代码所在的目录src中,编写Makefile.am文件,其内容如下:

bin_PROGRAMS = ap_collector ap_server
#Add extra debug info for gdb
AM_CFLAGS = -ggdb
ACLOCAL_AMFLAGS = -I m4
# libnfdump sources
ipmap = ip_map.c ip_map.h
getregion = get_region.c get_region.h
pbkafka = pb_kafka.c pb_kafka.h
protobuf = proto/sflow.pb-c.c proto/sflow.pb-c.h
filelist = file_list.c file_list.h
redisclient = redis_client.c redis_client.h
parsefile = parse_file.c parse_file.h
getconfig = parse_config.c parse_config.h

ap_collector_SOURCES = $(ipmap) $(getregion) $(filelist) $(parsefile) $(redisclient) $(getconfig)
ap_collector_LDADD = -lhiredis -lmysqlclient

ap_server_SOURCES = region_aggr.c $(ipmap) $(pbkafka) $(protobuf) $(getconfig)
ap_server_LDADD = -lhiredis -lrdkafka -lprotobuf-c

其中,bin_PROGRAMS为要生成的可执行文件名,可以为多个。

AM_CFLAGS = -ggdb为开启调试。

ACLOCAL_AMFLAGS = -I m4,当使用libtoolize生成config.guess, config.sub, ltmain.sh, ltconfig时需要设置这个位置。

接下来定义源码。每个二进制文件都有相应的源码和所需的静态链接库。

在源码的父目录中,编辑Makefile.am,添加含有Makefile.am的子目录:

ACLOCAL_AMFLAGS = -I m4
SUBDIRS = . src

(二)autoscan

在工作目录中执行autoscan,会生成configurae.scan。修改configure.scan内容之后,命名为configure.ac。

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

AC_PREREQ([2.69])
#AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_INIT([analysis_region, 1.0.1, xx@xx.com)
#AC_CONFIG_SRCDIR([src/pb_kafka.h])
#AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([subdir-objects])
AC_CONFIG_MACRO_DIR([m4])

# Checks for programs.
AC_PROG_CC
AM_PROG_CC_C_O
AC_PROG_LIBTOOL
AC_SUBST(LIBTOOL_DEPS)
AC_PROG_GREP
AC_PROG_NM
AC_PROG_SED

# Checks for libraries.
# FIXME: Replace `main' with a function in `-lhiredis':
AC_CHECK_LIB([hiredis], [main])
# FIXME: Replace `main' with a function in `-lmysqlclient':
AC_CHECK_LIB([mysqlclient], [main])
# FIXME: Replace `main' with a function in `-lrdkafka':
AC_CHECK_LIB([rdkafka], [main])

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

# Checks for typedefs, structures, and compiler characteristics.
AC_C_INLINE
AC_TYPE_INT64_T
AC_TYPE_SIZE_T
AC_CHECK_HEADER_STDBOOL
AC_TYPE_UINT16_T
AC_TYPE_UINT32_T
AC_TYPE_UINT8_T

# Checks for library functions.
AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
AC_FUNC_MALLOC
AC_FUNC_MKTIME
AC_FUNC_MMAP
AC_FUNC_REALLOC
AC_CHECK_FUNCS([gettimeofday memset strchr strdup strerror strndup])

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

如上,增加一下3行内容:

AM_INIT_AUTOMAKE([subdir-objects])   #多层目录的automake
AC_CONFIG_MACRO_DIR([m4]) #用于libtoolize

AM_PROG_CC_C_O   #子目录的编译

至此,configure.ac就完成了

(三)执行libtoolize

生成config.guess, config.sub, ltmain.sh, ltconfig

(四)执行aclocal

生成aclocal.m4

(五)执行autoconf

生成configure文件

(六)执行automake --add-missing

生成Makefile.in文件

(七)执行./configure --prefix=`pwd`

生成Makefile文件

(八)执行make && make install

将可执行二进制文件安装到当前目录的./bin/下


至此,使用autoconf和automake编译完成,最终目录下的文件如下图所示:



附学习过程中参考的一篇关于autotool介绍的博客,写得不错:https://my.oschina.net/qihh/blog/66113

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>我们正在讨论的是autotools工具链中的两个关键文件:configure.acMakefile.am。 首先,用户要求简述这两个文件的作用、内容使用场景。 根据autotools的工作流程: 1. configure.ac(以前叫configure.in)是autoconf工具的输入文件,用于生成configure脚本。 2. Makefile.amautomake工具的输入文件,用于生成Makefile.in(再由configure脚本生成最终的Makefile)。 下面我将分别简述这两个文件。 </think>### configure.ac Makefile.am 的简述 #### 一、configure.ac 的作用与内容 **作用**: 作为 Autoconf 工具的核心输入文件,用于生成可移植的 `configure` 脚本。该脚本负责检测系统环境(如编译器、库依赖、平台特性等),最终生成适配当前系统的 `Makefile`。 **典型内容**: ```m4 AC_INIT([项目名], [版本号]) # 初始化项目信息 AM_INIT_AUTOMAKE # 初始化Automake AC_PROG_CC # 检测C编译AC_CHECK_HEADER([stdio.h]) # 检查头文件 AC_CHECK_LIB([m], [sin]) # 检查数学库 AC_CONFIG_FILES([Makefile]) # 指定输出文件 AC_OUTPUT # 结束配置 ``` **使用场景**: - 跨平台项目编译(如 Linux/macOS/BSD 兼容) - 动态处理依赖库(自动检测缺失库并报错) - 生成标准化的 `config.h` 头文件(保存系统配置宏) #### 二、Makefile.am 的作用与内容 **作用**: 作为 Automake 工具的输入文件,定义编译规则文件结构,最终生成符合 GNU 标准的 `Makefile.in` 模板(供 `configure` 脚本使用)。 **典型内容**: ```makefile bin_PROGRAMS = myapp # 生成可执行文件 myapp myapp_SOURCES = main.c util.c # 源文件列表 include_HEADERS = utils.h # 安装头文件 dist_data_DATA = config.ini # 打包数据文件 ``` **使用场景**: - 自动化编译流程(自动推导依赖关系) - 生成安装/卸载规则(`make install` / `make uninstall`) - 打包发布(`make dist` 生成 .tar.gz 源码包) #### 三、协同工作流程 1. **生成工具链**: ```bash aclocal &amp;&amp; autoconf &amp;&amp; automake --add-missing ``` 2. **用户编译**: ```bash ./configure &amp;&amp; make &amp;&amp; make install ``` `configure.ac` 生成 `configure` 脚本 → `Makefile.am` 生成 `Makefile.in` → `configure` 结合两者生成最终 `Makefile`。 **核心价值**: 解决跨平台编译的复杂性,开发者无需手动编写维护平台相关的编译规则[^1]。例如,通过 `AC_CHECK_LIB` 自动处理库依赖,避免硬编码路径[^2]。 --- ### 相关问题 1. 如何在 `configure.ac` 中检测 OpenSSL 库是否存在? 2. `Makefile.am` 中的 `_PROGRAMS` `_LIBRARIES` 后缀有何区别? 3. Autotools 工具链包含哪些组件及其相互关系? 4. 如何通过 `make distcheck` 验证源码包的完整性?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值