linux--Autotools

本文概述了Autotools工具集(Autoconf, Automake, Libtool)在软件配置中的核心作用,从Autotools的发展历程,手写Makefile的挑战,到Autoconf自动生成configure脚本、Automake简化Makefile管理,以及Libtool处理动态库问题。同时,文章提到了cmake作为替代方案的兴起,及其简化配置过程的特点。

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

1 介绍

Autoconf是一个用于生成shell脚本的工具,可以自动配置软件源代码以适应多种类似POSIX的系统。为了让你的软件包在所有的不同系统上都可以进行编译。Autotools主要有Autoconf、automake、libtool等软件包工具组成,我们可以称为Autotools三剑客。
本质是产生makefile文件的工具。
cmake产生的晚,解决了很多autotools工具的问题。autotools是一个工具集具有强大的灵活性,但是因为步骤太多,配置繁琐,产生了很多的替代方案,cmake是其中最优秀的之一。

Automake

为了兼容各个系统的make使用。
从Makefile.am文件和Autoconf一起生成Makefile.in文件。

Gnulib

这是GNU代码的中央仓库,目的是共享免费的软件包。它的共享是源码级别的,只需要从上面直接拉取到自己的源码树。

Libtool

生产动态的共享库是非常困难的事情,每个系统都有自己的编译工具、编译标志、etc.。
Libtool会处理所有的共享库请求。需要共享库的时候会自Libtool会自动地被使用,无需知晓其语法规则。

2 步骤

在这里插入图片描述

1.运行autoscan命令
2.将configure.scan 文件重命名为configure.in,并修改configure.in文件
3.在project目录下新建Makefile.am文件,并在core和shell目录下也新建makefile.am文件
4.在project目录下新建NEWS、 README、 ChangeLog 、AUTHORS文件
5./usr/share/automake-1.X/目录下的depcomp和complie文件拷贝到本目录下
6.运行aclocal命令
7.运行autoconf命令
8.运行automake -a命令
9.运行./confiugre脚本

在这里插入图片描述

cmake的步骤

1.编写CMakeLists.txt
2.运行cmake命令

3 Autotools发展史 引Autotools发展史

Makefile语法复杂、难以维护。对于一个小项目还好,对于大型的项目和开源项目,现在流行使用一些工具自动生成Makefile,可以大大减轻软件开发人员的负担。
比较常见的工具有GNU Autotools、CMake、QMake、SCons、Ant等。

手写makefile时代

早期我们在Unix、linux环境下开发软件,makefile都是手写的

Autoconf时代

后来linux操作系统问世,后续的版本也越来越多,各种发布版本错综复杂,差异越来越大,甚至包括操作系统的接口都出现差异。这时候别说makefile能不能正确编译的问题了,就连我们编写的应用程序,即使编译正确,也有可能在其它的平台上运行不起来。这个问题,大家都知道,后来出现了POSIX API标准,就是可移植的操作系统接口。对于makefile来说,为了适配操作系统的更多版本,只能不断地添加代码,这就导致configure脚本越来远大,导致后来开发人员再也受不了了,维护成本越来越高。
1991年,David Mackenzie开发了Autoconf工具,用来自动生成configure脚本
用户只需要定义几个宏,表示我们关心的配置选项,保存在configure.ac文件里,然后使用Autoconf工具就可以帮我们自动生成configure脚本了!

automake时代

然而,随着项目越来越大,makefile也越来越复杂,尤其是大型项目,手写越来越困难,怎么办?
automake工具这个时候闪亮登场了!
对于开发人员来说,我们关心的就是这个项目要生成什么可执行文件,需要编译哪些源文件,至于怎么编译的?底层的链接细节,鬼才懒得管。
后来,为了进一步减少工作量,又出现一个aclocal工具,会自动将automake、autoconf以及用户定义的所有宏统统放在aclocal.m4文件里。
为什么要保存在aclocal.m4这种格式的文件里?我也不知道…,m4,macro宏后面4个字母,缩写就是m4.

libtool时代

随着Unix、Linux之间的差异越来越大,对动态共享库的管理差异也越来越大,比如有些共享库,使用.so格式,有的是.a,有的是.o的形式。运行时对动态库的管理方式也一样,有的操作系统支持动态加载,有的就不支持。这就对我们Makefile带来了挑战。怎么办?libtool的工具出现就是为了解决这个问题的,它通过对生成的动态库进行抽象,统一生成.la的形式,可以支持十几种各种不同的平台。

参考

1、官方autoconf
2、Autoconf简介
3、cmake与autoconf+automake的对比
4、Autotools
5、在Linux操作系统下自动生成Makefile的方法
6、autotools简介0
7、Autotools发展史
8、autoconf介绍1

<think>我们正在为交叉编译环境解决libdrm版本问题。用户使用arm-linux-gnueabi工具链,意味着目标平台是ARM架构的嵌入式Linux系统。之前给出的解决方案是针对x86_64主机的,现在需要调整为交叉编译。核心步骤:1.获取libdrm源码并交叉编译安装到指定目录(比如$SYSROOT)2.确保编译Mesa时能够找到交叉编译的libdrm具体步骤:步骤1:设置交叉编译环境变量假设用户已经配置好了arm-linux-gnueabi工具链,我们可以设置以下环境变量(具体路径根据用户工具链安装位置调整):exportCC=arm-linux-gnueabi-gccexportCXX=arm-linux-gnueabi-g++exportAR=arm-linux-gnueabi-arexportRANLIB=arm-linux-gnueabi-ranlibexportPKG_CONFIG_PATH=/path/to/your/sysroot/usr/lib/pkgconfig#重要:指定交叉编译的pkg-config路径,确保它指向sysroot中的.pc文件注意:用户需要有一个ARM平台的sysroot(包含头文件和库的目录)步骤2:交叉编译libdrm下载libdrm源码,并交叉编译安装到sysroot中。示例命令:wgethttps://dri.freedesktop.org/libdrm/libdrm-2.4.75.tar.gz#确保版本>=2.4.75tar-xzvflibdrm-2.4.75.tar.gzcdlibdrm-2.4.75./configure--host=arm-linux-gnueabi--prefix=/path/to/sysroot/usr#这里指定安装到sysroot的/usr目录下makemakeinstall注意:如果用户使用的是meson构建系统,则需要用meson交叉编译,但考虑到嵌入式环境可能更习惯autotools,这里使用autotools方式。步骤3:验证sysroot中的libdrm版本安装完成后,检查sysroot中是否已更新libdrm:arm-linux-gnueabi-pkg-config--modversionlibdrm#如果PATH中找不到,则用完整路径步骤4:交叉编译Mesa在编译Mesa时,需要指定使用交叉编译的libdrm。同样设置交叉编译环境变量,然后在配置Mesa时通过`--prefix`指定安装到sysroot,并确保PKG_CONFIG_PATH指向sysroot中的.pc文件。示例命令:cdmesa./autogen.sh\--host=arm-linux-gnueabi\--prefix=/path/to/sysroot/usr\--enable-gles2\--enable-egl\--with-egl-platforms='drmfbdev'#根据目标平台选择makemakeinstall步骤5:如果遇到pkg-config找不到libdrm,可以显式指定在配置Mesa时,可以显式指定libdrm的CFLAGS和LDFLAGS:./autogen.sh...\DRM_CFLAGS="-I/path/to/sysroot/usr/include/libdrm"\DRM_LIBS="-L/path/to/sysroot/usr/lib-ldrm"注意事项:1.交叉编译时,所有依赖(如libdrm)都必须用相同的工具链编译并安装到同一个sysroot中。2.如果目标板上的libdrm版本过低,也需要更新目标板上的libdrm库。引用说明:Mesa文档指出,从18.3版本开始,要求libdrm>=2.4.75以支持原子显示操作[^1]。生成相关问题:1.如何设置arm-linux-gnueabi交叉编译环境?2.交叉编译时如何解决其他依赖库的版本问题?3.如何将更新后的Mesa和libdrm部署到ARM开发板?4.交叉编译Mesa时还有哪些常见错误?按照用户要求,使用$...$和$$...$$格式。在回答中我们可能需要使用环境变量设置,比如$CC,所以用$包裹。</think> 为了解决在使用 `arm-linux-gnueabi` 工具链时遇到的 `configure error: Direct rendering requires libdrm >= 2.4.75` 错误,以下是完整的交叉编译解决方案: ### 🔧 分步解决方案(ARM交叉编译环境) 1. **安装ARM工具链依赖** ```bash sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi \ pkg-config-arm-linux-gnueabi meson ninja-build ``` 2. **交叉编译libdrm >= 2.4.75** ```bash wget https://dri.freedesktop.org/libdrm/libdrm-2.4.115.tar.xz tar xf libdrm-2.4.115.tar.xz cd libdrm-2.4.115 # 设置ARM交叉编译环境 export CC=arm-linux-gnueabi-gcc export CXX=arm-linux-gnueabi-g++ export AR=arm-linux-gnueabi-ar export RANLIB=arm-linux-gnueabi-ranlib # ARM交叉编译配置 meson build-arm/ \ --cross-file cross.txt \ --prefix=/usr/arm-linux-gnueabi \ -Dintel=false \ -Dradeon=false \ -Damdgpu=false \ -Dnouveau=false \ -Dvmwgfx=false \ -Dfreedreno=false ninja -C build-arm/ sudo ninja -C build-arm/ install ``` 3. **创建交叉编译配置文件** `cross.txt` ```ini [host_machine] system = 'linux' cpu_family = 'arm' cpu = 'armv7' # 根据目标设备调整 endian = 'little' [binaries] c = 'arm-linux-gnueabi-gcc' cpp = 'arm-linux-gnueabi-g++' ar = 'arm-linux-gnueabi-ar' pkgconfig = 'pkg-config-arm-linux-gnueabi' ``` 4. **验证交叉编译的libdrm** ```bash arm-linux-gnueabi-pkg-config --modversion libdrm # 应输出: 2.4.115 ``` 5. **配置Mesa时指定ARM工具链** ```bash cd mesa-source-directory/ export PKG_CONFIG_PATH=/usr/arm-linux-gnueabi/lib/pkgconfig ./configure --host=arm-linux-gnueabi \ --enable-gles2 \ --enable-egl \ --with-platforms=drm \ --with-dri-drivers="swrast" \ --with-gallium-drivers="swrast" make -j$(nproc) ``` ### ⚠️ 关键注意事项 1. **驱动选择性编译** 当GPU驱动未知时,仅编译软件渲染驱动(`swrast`)。确认目标设备GPU型号后可启用特定驱动: ```bash # NVIDIA Tegra设备示例 --with-gallium-drivers="tegra" ``` 2. **库路径验证公式** 确保链接器找到正确版本: $$ \text{ldd --root=/path/to/sysroot} \quad /path/to/mesa/binary \quad | \quad \text{grep libdrm} $$ 输出应符合:`libdrm.so.2 => /usr/arm-linux-gnueabi/lib/libdrm.so.2` 3. **ABI兼容性处理** 对于不同的ARM架构(如ARMv6/v7/v8): - 在 `cross.txt` 中调整 `cpu_family` 和 `cpu` - 添加编译标志:`CFLAGS="-march=armv7-a -mfpu=neon"` 4. **依赖传递性** libdrm的依赖链:Mesa → libdrm → kernel DRM API[^1]。若目标设备内核<4.14,需启用兼容模式: ```bash meson build-arm/ -Dkernel-version=legacy ``` ### 💡 根本原因说明 此错误源于Mesa对DRM原子操作特性的强制要求。原子操作(atomic modesetting)需: - 内核DRM接口版本 ≥ 1.3(对应Linux 3.17+) - $ \text{libdrm} \geq \text{2.4.75} $ 在ARM平台,这些特性是节能渲染的关键基础[^2]。 --- ### 📌 部署建议 将编译产物部署到目标设备后: ```bash # 在ARM设备上验证 MESA_GL_VERSION_OVERRIDE=3.0 glxinfo | grep "OpenGL version" # 应显示基于DRM的软件渲染器 # 检查Direct Rendering状态 eglinfo | grep "DRM platform" # 应返回: ✔ yes ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

worthsen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值