Makefile.am编写规则

本文介绍了如何使用Makefile.am来高效地构建项目。包括定义可执行文件、动态库和静态库的方法,以及设置编译和链接选项等内容。

概念

    Makefile.am是比Makefile更高层次的规则只需要指定要生成什么目标,依赖于什么文件,和要安装到什么目录。automake会根据Makefile.am来自动生成Makefile.in 。Makefile.am里边使用的都是宏,常见的有

.PROGRAMS ;表示可执行文件

.LIBRARIES ;表示库文件

.LTLIBRARIES ;表示库文件,LT表示libtool

.HEADERS ;头文件

.DATA ;数据文件

1、编译可执行文件

复制代码
#Makefile.am文件
bin_PROGRAMS = xxx #bin_PROGRAMS 表示指定要生成的可执行应用程序文件,这表示可执行文件在安装时需要被安装到系统
#中;如果只是想编译,不想被安装到系统中,可以用noinst_PROGRAMS来代替
xxx_SOURCES
= a.c b.c c.c main.c d.c xxx.c
#xxx_SOURCES表示生成可执行应用程序所用的源文件,这里注意,xxx_是由前面的bin_PROGRAMS
#指定的,如果前面是生成example,那么这里就是example_SOURCES,其它的类似标识也是一样
xxx_CPPFLAGS
= -DCONFIG_DIR=\"$(sysconfdir)\" -DLIBRARY_DIR=\"$(pkglibdir)\"
#xxx_CPPFLAGS 这和Makefile文件中一样,表示C语言预处理参数,这里指定了DCONFIG_DIR,以后
#在程序中,就可以直接使用CONFIG_DIR。不要把这个和另一个CFLAGS混淆,后者表示编译器参数

xxx_LDFLAGS = -export-dynamic -lmemcached
#xxx_LDFLAGS 连接的时候所需库文件的标识,这个也就是对应一些如-l,-shared等选项
noinst_HEADERS
= xxx.h #这个表示该头文件只是参加可执行文件的编译,而不用安装到安装目录下。如果需要安装到系统中,
#可以用include_HEADERS来代替
INCLUDES
= -I/usr/local/libmemcached/include/ #INCLUDES 链接时所需要的头文件
xxx_LDADD
= $(top_builddir)/sx/libsession.a \ $(top_builddir)/util/libutil.a
#xxx_LDADD 链接时所需要的库文件,这里表示需要两个库文件的支持
复制代码

 2、编译动态库文件

      要生成xxx.so文件

#Makefile.am文件
xxxlibdir=$(libdir)//新建一个目录,该目录就是lib目录,运行后xxx.so将安装在该目录下 xxxlib_PROGRAMS=xxx.so xxx_so_SOURCES=xxx.c xxx_so_LDFLAGS=-shared -fpic //GCC编译动态库的选项

3、编译静态库文件

     要生成xxx.a

#Makefile.am文件
noinst_LTLIBRARIES = xxx.a noinst_HEADERS = a.h b.h xxx_a_SOURCES = a.c b.c xxx.c
<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、付费专栏及课程。

余额充值