linux下autoscan, aclocal, autoconf, automake以及Makefile.am, Configure.in等文件和工具的使用

本文介绍在Linux环境下如何使用autoscan、aclocal、autoconf及automake等工具进行项目的自动化构建。从创建源文件开始,逐步生成configure脚本及Makefile.in文件,并最终通过configure命令生成Makefile。

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

本文转自:http://blog.chinaunix.net/uid-26575352-id-3411843.html


本文章简单介绍了linux下autoscan, aclocal, autoconf, automake以及Makefile.am, Configure.in等文件和工具的使用。


autoscan 		# 根据路径下生成configure.scan 和 autoscan.log
aclocal 		# 产生 aclocal.m4
autoconf 		# 根据 configure.in 生成configure 
automake --add-missing 	# 根据 Makefile.am生成Makefile.in



例子:在/hello/目录下创建一个hello.c文件,并编译运行它:

#cd /hello/

(1) 编写源文件hello.c:

#include <stdio.h>
int main(int argc, char** argv)
{
    printf("Hello, GNU!n");
    return 0;
}

(2) #autoscan 

->生成 configure.scan 和 autoscan.log


(3) 将configure.scan 修改为 configure.in:

并修改configure.in内容如下

# Process this file with autoconf to produce a configure script.
AC_INIT(hello.c)
AM_INIT_AUTOMAKE(hello, 1.0)
# Checks for programs.
AC_PROG_CC
# Checks for library functions.
AC_OUTPUT(Makefile)

(4) #aclocal

->生成 aclocal.m4 和 autom4te.cache (生成aclocal.m4的过程中涉及到configure.in)

(5) #autoconf
->生成 configure (根据 configure.in, 和 aclocal.m4)

(6) 编写Makefile.am:

AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c


(7) #automake --add-missing
->生成 Makefile.in, depcomp, install-sh, 和 missing (根据 Makefile.am, 和 aclocal.m4)

(8) #./configure
->生成 Makefile, config.log, 和 config.status

(9) 在configure时指定需要链接的外部头文件和库
     注意 export
	export LDFLAGS="-L/home/songwei/double-conversion/" CPPFLAGS="-I/home/songwei/double-conversion/src/" CFLAGS="-I/home/songwei/double-conversion/src/" LIBS="-ldouble_conversion -ldouble_conversion_pic"
	./configure --prefix=/usr/local/folly


---------------------------------------------------------------------------------------------------------------------------------------------------------------------


本文转自  http://blog.chinaunix.net/uid-26575352-id-3411843.html

其他相关资料:

《automake连载---关于两个文件configure.in和Makefile.am的编写》

图解autoscan、aclocal、autoheader、automake、autoconf、configure、make 

<think>嗯,用户之前问了如何指定Makefile文件,现在又进一步想了解Makefile.amMakefile.in的区别以及它们的用途。我需要结合之前的回答用户提供的引用内容来组织答案。 首先,用户的问题分为两个部分:如何在make命令中指定Makefile文件,以及Makefile.amMakefile.in的区别。关于指定Makefile文件的部分,我之前已经详细回答了,可能需要简要回顾一下,但重点放在区别上。 用户提供的引用提到Makefile.am由程序员编写,automake生成Makefile.in,再由configure脚本生成最终的Makefile。需要明确这三者的关系,以及各自的作用。用户可能在使用automake工具链时遇到困惑,所以需要解释清楚每个文件的用途生成过程。 要注意用户可能对autotools的工作流程不太熟悉,所以需要用简单的中文解释,避免术语过多。同时,结合之前的回答,强调如何指定自定义名称的Makefile文件,特别是当使用automake生成的情况下,可能需要指定不同的文件。 另外,用户可能在开发中需要手动编写Makefile,或者使用自动生成工具,所以需要区分不同场景下的使用方式。比如,在automake流程中,用户通常不会直接修改Makefile.in,而是通过修改Makefile.am来自动生成。而手动编写的Makefile则不需要这些步骤。 还要注意引用中的内容,比如引用[1][2]提到automake生成Makefile.inconfigure生成Makefile,引用[3]提到手动编写符合惯例的Makefile的难度。这些内容需要整合到回答中,说明为什么会有这些文件的存在,以及它们如何简化开发流程。 最后,确保回答结构清晰,分点说明,并包含操作示例,帮助用户理解如何在实际中使用这些文件。可能还需要提到常见错误,比如在automake流程中直接修改Makefile.in导致的问题,提醒用户正确的工作流程。</think>#### **一、指定Makefile文件的完整方法** 当使用非默认名称的Makefile时,必须通过 `-f` 参数显式指定文件。以下是具体场景及验证方法: --- ##### **1. 基础语法** ```bash make -f <自定义文件名> [目标] -j$(nproc) ``` - **示例**: ```bash make -f Buildfile clean # 执行清理操作 make -f Buildfile install -j8 # 带并行编译的安装 ``` ##### **2. 路径处理** - **相对路径**: ```bash make -f ./build/debug.mk ``` - **绝对路径**: ```bash make -f /opt/project/config/arm64.mk ``` ##### **3. 动态验证** 通过 `ls` `file` 命令验证文件有效性: ```bash ls -l Buildfile &amp;&amp; file Buildfile # 确认文件存在且为文本文件 ``` --- #### **二、Makefile.amMakefile.in的核心区别** 通过Autotools工具链(automake/autoconf)的生成流程理解二者关系: ##### **1. 文件角色对比表** | **文件类型** | **创建者** | **修改权限** | **典型内容** | **生命周期阶段** | |------------------|---------------|--------------|----------------------------------|---------------------| | `Makefile.am` | 开发者手动编写 | 可编辑 | 声明目标、源码、编译选项 | 项目初始化阶段 | | `Makefile.in` | automake生成 | 禁止直接修改 | 含`@VARIABLE@`的模板 | `./configure`执行前 | | `Makefile` | configure生成 | 自动生成 | 替换变量后的完整编译指令 | 构建阶段 | ##### **2. 生成流程详解** ```mermaid graph TD A[Makefile.am] -->|automake| B(Makefile.in) B -->|configure脚本| C(Makefile) C -->|make命令| D[可执行文件] ``` - **关键过程**: 1. 开发者编写 `Makefile.am`,定义如: ```makefile bin_PROGRAMS = hello hello_SOURCES = main.c utils.c ``` 2. 运行 `automake --add-missing` 生成 `Makefile.in`(包含平台相关占位符) 3. `./configure` 扫描系统环境,将 `Makefile.in` 中的 `@CC@`、`@CFLAGS@` 替换为实际值,输出最终 `Makefile` ##### **3. 文件内容差异示例** - **Makefile.am**(开发者维护): ```makefile ACLOCAL_AMFLAGS = -I m4 SUBDIRS = src lib ``` - **Makefile.in**(自动生成): ```makefile CC = @CC@ CFLAGS = @CFLAGS@ all: $(SUBDIRS) ``` --- #### **三、Autotools工具链最佳实践** ##### **1. 开发环境配置** ```bash # 安装必要工具 sudo apt-get install automake autoconf libtool # 初始化项目 autoscan &amp;&amp; mv configure.scan configure.ac aclocal autoheader automake --add-missing autoconf ``` ##### **2. 常见问题排查** - **错误**:`missing automake-1.16` - **解决方案**: ```bash autoreconf --install # 自动修复工具链版本 ``` - **错误**:`undefined reference to 'function_name'` - **根源**:`Makefile.am` 中缺少库链接声明 - **修正**: ```makefile hello_LDADD = -lmylib # 添加链接库 ``` --- #### **四、手动编写 vs 自动生成的抉择** | **场景** | **推荐方案** | **优势** | |------------------------|--------------------|-----------------------------------| | 小型单文件项目 | 手动编写Makefile | 简单直接,无需复杂配置 | | 跨平台C/C++项目 | 使用Autotools | 自动处理编译器差异依赖检测 | | 需要打包RPM/DEB | 必须用Autotools | 符合Linux发行版打包规范[^1] | | 嵌入式系统交叉编译 | CMake+Autotools组合| 兼顾灵活性自动化(引用[3]) | --- #### **五、引用说明** - **Makefile.in的模板作用**:允许configure阶段动态插入系统特定参数(如编译器路径)[^1] - **automake --add-missing**:自动补全缺失的标准文件(如`INSTALL`、`COPYING`)[^2] - **跨平台构建**:Autotools可自动检测POSIX兼容性问题硬件特性(引用[3])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值