Makefile.am, Makefile.in 与 Makefile的关系

本文详细介绍了Makefile.am、Makefile.in与Makefile之间的关系,以及aclocal、automake和autoconf等命令的作用。通过一个简单的示例,即创建并编译一个名为hello.c的文件,展示了如何使用这些GNU工具。

文章出处:http://blog.mcuol.com/User/wangguangdong/Article/17384_1.htm

 

Makefile.am, Makefile.in, Makefile之间关系以及aclocal, automake, autoconf等命令作用的探究

 

aclocal   #产生 aclocal.m4
libtoolize --force
automake --add-missing   #根据Makefile.am生成Makefile.in
autoconf   #根据configure.in 生成configure
autoheader

为了弄清楚automake等一系列命令的作用,专门搜集并阅读了一些相关资料。并通过下面一个小例子,熟悉了一下这些GNU工具的使用:

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

#cd /hello/

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

include
int main(int argc, char** argv)
{
printf("Hello, GNU!n");
return 0;
}

(2) #autoscan
->生成 configure.scan 和 autoscan.log

(3) 将configure.scan 修改为 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

<think>我们正在解决编译时出现的`libguile.h`缺失问题,并探讨`Makefile.am``Makefile.in`在自动生成流程中的作用。用户的问题集中在如何通过安装开发包、配置构建系统来解决头文件缺失,以及理解Autotools(automake)的工作流程。###解决`fatalerror:libguile.h:Nosuchfileordirectory`####1.**安装Guile开发包**必须安装GNUGuile的开发包(包含头文件库)。根据系统选择:-**Debian/Ubuntu**:```bashsudoapt-getinstalllibguile-3.0-dev#安装Guile3.0开发包```-**RHEL/CentOS**:```bashsudoyuminstallguile-devel```-**Fedora**:```bashsudodnfinstallguile-devel```安装后,头文件通常位于`/usr/include/guile/3.0/`(版本号可能不同)[^1]。####2.**验证头文件路径**检查`libguile.h`是否存在:```bashfind/usr-name'libguile.h'2>/dev/null```####3.**配置构建环境**如果使用Autotools(`configure`脚本)构建项目:-确保开发包安装后重新运行`configure`:```bash./configure```它会自动检测Guile并设置正确的头文件路径[^2]。####4.**手动指定头文件路径(备选)**如果构建系统未自动处理,可手动添加编译标志:```bashCFLAGS="-I/usr/include/guile/3.0"./configure```---###理解`Makefile.am``Makefile.in`的自动生成流程Autotools(automake+autoconf)用于生成可移植的构建系统。流程如下:####1.**编写`Makefile.am`**-开发者定义项目构建规则(例如编译目标、依赖):```makefilebin_PROGRAMS=my_programmy_program_SOURCES=main.cmy_program_CPPFLAGS=$(GUILE_CFLAGS)#头文件搜索路径my_program_LDADD=$(GUILE_LIBS)#链接库```-`GUILE_CFLAGS``GUILE_LIBS`由`configure`脚本通过`pkg-config`填充[^3]。####2.**生成`Makefile.in`**-运行`automake`将`Makefile.am`转换为模板`Makefile.in`:```bashautomake--add-missing#通常autoreconf一起使用```-`Makefile.in`包含占位符(如`@GUILE_CFLAGS@`),将在`configure`运行时被替换。####3.**生成`configure`脚本**-使用`autoconf`处理`configure.ac`生成`configure`:```bashautoconf```-`configure.ac`中需包含Guile依赖检查:```m4PKG_CHECK_MODULES([GUILE],[guile-3.0])#检查Guile并设置GUILE_CFLAGS/GUILE_LIBS```####4.**用户构建流程**用户执行标准步骤:```bash./configure#检测系统环境,生成Makefilemake#使用Makefile编译sudomakeinstall#安装```####依赖关系图```mermaidgraphLRA[Makefile.am]-->|automake|B[Makefile.in]C[configure.ac]-->|autoconf|D[configure]D-->|运行|E[Makefile]B-->E```>**关键点**:>-`Makefile.am`是开发者编写的抽象规则;>-`Makefile.in`是Autotools生成的中间模板;>-`configure`根据系统配置将`Makefile.in`转为最终`Makefile`[^4]。§§相关问题§§1.Autotools中`configure.ac`如何检查第三方库的存在?2.如何为项目添加自定义的编译选项(如启用调试模式)?3.当`./configure`报告“Guilenotfound”时如何解决?4.`pkg-config`在构建过程中起什么作用?[^1]:开发包提供头文件链接库,编译器需要它们完成预处理链接。[^2]:`configure`脚本通过环境变量或`pkg-config`探测依赖库路径。[^3]:`pkg-config`提供标准化的编译链接标志查询接口。[^4]:Autotools通过生成脚本适配不同Unix系统,解决兼容性问题。</think>### 解决 "fatal error: libguile.h: No such file or directory" 及 Makefile 自动生成流程 #### 一、问题根本原因 该错误表明编译时缺少 GNU Guile 库的开发文件(头文件链接库)。解决方案需同时处理**依赖安装****构建系统配置**。 #### 二、完整解决步骤 1. **安装 Guile 开发包** ```bash # Debian/Ubuntu sudo apt-get install libguile-3.0-dev # 或 libguile-2.2-dev # RHEL/CentOS sudo yum install guile-devel # Fedora sudo dnf install guile-devel ``` 验证安装: ```bash find /usr -name 'libguile.h' 2>/dev/null # 典型输出: /usr/include/guile/3.0/libguile.h ``` 2. **配置构建系统(Autotools 流程)** Autotools 构建链的关系: ```mermaid graph LR A[configure.ac] -->|autoconf| B[configure] C[Makefile.am] -->|automake| D[Makefile.in] B -->|运行| E[Makefile] D --> E ``` **关键文件作用**: - `configure.ac`:定义项目依赖系统检查 - `Makefile.am`:声明构建规则 - `Makefile.in`:Autotools 生成的模板 - `Makefile`:最终构建文件 3. **添加 Guile 依赖检测** 在 `configure.ac` 中添加: ```m4 PKG_CHECK_MODULES([GUILE], [guile-3.0]) AC_SUBST(GUILE_CFLAGS) AC_SUBST(GUILE_LIBS) ``` 4. **配置 Makefile.am** ```makefile bin_PROGRAMS = your_program your_program_SOURCES = main.c your_program_CPPFLAGS = $(GUILE_CFLAGS) # 头文件路径 your_program_LDADD = $(GUILE_LIBS) # 链接库 ``` 5. **重新生成构建系统** ```bash autoreconf -fiv # 重新生成 configure Makefile.in ./configure # 检测依赖并生成 Makefile make # 正常编译 ``` #### 三、工作流程详解 1. **开发者编写**: - `configure.ac`:使用 M4 宏定义依赖检查 - `Makefile.am`:声明目标、源文件编译规则 2. **生成中间文件**: ```bash aclocal # 收集宏 autoconf # 生成 configure 脚本 automake --add-missing # 生成 Makefile.in ``` 3. **用户构建**: ```bash ./configure # 扫描系统环境,替换 Makefile.in 中的变量 make # 使用最终 Makefile 编译 ``` > **关键点**: > `PKG_CHECK_MODULES` 会通过 `pkg-config` 查询 `guile-3.0.pc` 文件,自动设置 `GUILE_CFLAGS` `GUILE_LIBS`[^1]。 > `Makefile.in` 中的占位符如 `@GUILE_CFLAGS@` 在 `./configure` 阶段被替换为实际路径[^2]。 #### 四、验证配置结果 检查生成的 `Makefile` 中是否包含正确路径: ```makefile # 应包含类似内容: your_program_CPPFLAGS = -I/usr/include/guile/3.0 your_program_LDADD = -lguile-3.0 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值