configure的交叉编译问题

本文介绍如何使用configure进行交叉编译,包括配置编译器、依赖库及头文件路径的方法,并解释了--build、--host与--target参数的作用。

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

configure的交叉编译问题

 (2012-09-08 23:10)

  这个是前一篇CMake交叉编译的后继。针对的也是像我一样,对Linux下configure编译工具毫不了解但是要用它们做交叉编译的程序猿们。

  首先,所谓的configure虽然用的多,但是它也只是一个自动生成的东西,如果你打开这个东西一看,那真和天书差不多。我们下载下来的Linux开源工程,往往编译步骤是先执行命令./configure,检查是否符合编译条件,然后生成一个Makefile,才是make & make install。这个configure是一个自动生成的脚本文件,所用的工具是autoconf和automake,这两个工具,根据configure.in和makefile.am文件(可能还需要makefile.in吧,我不太清楚),生成configure。如果你拿到的开源代码有configure,那么肯定也有configure.in和makefile.am,这两个,才是人写给人看的,configure是机器写给机器看的。

  所以,如果我们想对一个由configure编译的工程进行交叉编译,一个思路就是修改configure.in和makefile.am(可以还需要修改makefile.in),不过显然我不是这样做的,太花时间了,还要额外去学autoconf和automake。一个比较简单的办法是通过设置configure的参数,因为configure也是一个工具,具有很好的可定制性。

  交叉编译,一般来说就是两个地方处理好就可以了:编译器和依赖库。

  对于configure来说,编译器可以通过环境变量CC来设置,因为configure生成编译器指向的时候,就是从环境变量里面找的,CC是C语言编译器,C++啊什么的,和普通Makefile的也是完全一样的。

  设置依赖库也是和makefile一样的,通过环境变量LDFLAGS。设置对应的头文件则是通过环境变量CFLAGS。

  那么,一个办法是直接修改这三个环境变量(暴力了一点),在一个办法就是在命令行里临时指定这三个环境变量,我用的是后面的办法,写了一个脚本文件如下:

CC=/usr/local/arm11-toolchain/g4.4.2/cross-tools/bin/g-4.4.2 \

LDFLAGS="-L/home/third_party/source/lib -L/home/third_party/library/g-4.4.2/zlib/lib" \

./configure  --build=i686-pc-linux --host=arm-linux --target=i686-linux \

 --enable-shared --prefix=$PREFIX \

 --with-freetype-config=$PREFIX/bin/freetype-config \

 --enable-libxml2 --with-arch=arm \

 CFLAGS=-I/home/third_party/library/g-4.4.2/freetype/include-I/home/third_party/library/g-4.4.2/freetype/include/freetype2 \

  第一行指定了交叉编译所用的编译器

  第二行指定了依赖库所在的目录

  最后一行是头文件所在目录,这个放在前面应该也可以……不过我没试过。

  但是需要注意的是粗体的那几行,--build指明的是在什么环境下编译,--host是要编译到哪个环境,--target是在什么环境下运行。如果你要做交叉编译,这三个选项是一定要写上的,否则configure不知道自己是在进行交叉编译。

  剩下的两个选项,就是原来的编译手册要求的,我照猫画虎放上去而已啦。每一行结束处的斜杠表示下一行要接上来(好长一行吧,所以才写成脚本)。

  你在做configure工程的交叉编译的时候,可以先试试看按照上面的办法,指定编译器、依赖库和头文件目录,另外就是加上build、host、target这三个参数,对于大部分程序,应该就可以了。

这里是一个比较详细的 configure参数:http://www.linuxsky.org/doc/newbie/200801/242.html

如果你对自己写configure有兴趣,可以参考这里:http://www.ibm.com/developerworks/cn/linux/l-makefile/


配置交叉编译 GStreamer 需要根据目标平台的架构和操作系统进行适当的设置。以下是一个通用的流程,适用于大多数嵌入式 Linux 平台。 ### 准备工作 1. **安装依赖项** 在主机系统上安装必要的构建工具和依赖库: ```bash sudo apt-get install build-essential libtool autoconf automake flex bison libglib2.0-dev ``` 2. **获取 GStreamer 源码** 使用 Git 克隆官方仓库: ```bash git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git cd gstreamer ``` ### 配置交叉编译环境 1. **创建构建目录** 推荐使用单独的构建目录以避免污染源码树: ```bash mkdir build && cd build ``` 2. **准备交叉编译工具链** 确保你已经安装了适用于目标平台的交叉编译工具链。例如,对于 ARM 架构,你可能需要 `arm-linux-gnueabi-gcc` 或 `arm-linux-gnueabihf-gcc`。 3. **使用 `meson` 配置交叉编译** GStreamer 使用 Meson 构建系统,可以通过交叉编译配置文件指定目标平台的信息。创建一个交叉编译配置文件 `cross-file.txt`,内容如下(以 ARM 架构为例): ```ini [host_machine] system = 'linux' cpu_family = 'arm' cpu = 'armv7' endian = 'little' [binaries] c = 'arm-linux-gnueabihf-gcc' cpp = 'arm-linux-gnueabihf-g++' ar = 'arm-linux-gnueabihf-ar' strip = 'arm-linux-gnueabihf-strip' pkgconfig = 'arm-linux-gnueabihf-pkg-config' [properties] needs_exe_wrapper = true ``` 4. **运行 `meson` 配置命令** 使用 `meson` 命令配置交叉编译环境: ```bash meson .. --cross-file cross-file.txt --prefix=/usr/local/arm-gst ``` 5. **构建与安装** 使用 `ninja` 构建并安装: ```bash ninja ninja install ``` ### 验证交叉编译结果 1. **检查生成的二进制文件** 确保生成的可执行文件是为目标平台编译的: ```bash file /usr/local/arm-gst/bin/gst-launch-1.0 ``` 输出应显示目标架构,例如: ``` /usr/local/arm-gst/bin/gst-launch-1.0: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, not stripped ``` 2. **部署到目标设备** 将编译好的 GStreamer 安装目录通过 `scp` 或其他方式复制到目标设备,并确保目标设备上的运行环境支持所需的库文件。 ### 可选:使用 `gst-build` 工具简化流程 GStreamer 官方提供了一个名为 `gst-build` 的工具,可以简化整个构建过程,尤其是对于交叉编译场景。你可以克隆 `gst-build` 仓库并使用其提供的交叉编译支持: ```bash git clone https://gitlab.freedesktop.org/gstreamer/gst-build.git cd gst-build meson _build --cross-file ../cross-file.txt ninja -C _build ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值