Linux系统下交叉编译安装第三库时常用的“./configure“命令介绍(包含对prefix配置参数和`make install`时指定的路径的区别)

对一个实例的分析

交叉编译tslib库时,用到了下面的命令:

./configure --host=arm-linux-gnueabihf --prefix=/

试解释这条命令。
这条命令用于为嵌入式 ARM 平台交叉编译 tslib 库。以下是命令逐部分的详细解释:


命令结构

./configure --host=arm-linux-gnueabihf --prefix=/
1. ./configure
  • 这是一个脚本文件,用于配置软件的构建环境。
  • 它根据当前系统环境(或指定的交叉编译环境)生成适合的 Makefile
  • 通常是由 autotools 工具链(如 autoconf)生成。

在交叉编译时,configure 脚本会被用来指定目标平台、编译器工具链等。


2. --host=arm-linux-gnueabihf
  • --host:指定目标运行平台(即生成的二进制文件运行的平台)。
  • arm-linux-gnueabihf
    注意:这并不是交叉编译工具链的前缀,对于IMX6ULL开发板来说,交叉编译工具的前缀是arm-buildroot-linux-gnueabihf,这个选项实际上是加tslib里面内置的选项。
    • arm:目标架构是 ARM(通常用于嵌入式设备)。
    • linux:目标操作系统是 Linux。
    • gnueabihf
      • gnu:使用 GNU 工具链。
      • eabi:遵循嵌入式应用二进制接口(Embedded Application Binary Interface)。
      • hf:表示硬件浮点运算支持(hard-float)。

总结:这部分表示目标平台是运行 Linux 的 ARM 设备,并且使用支持硬件浮点的 GNU 工具链进行编译。


3. --prefix=/
  • --prefix:指定软件的安装路径(根目录)。
  • /:表示将软件安装到目标设备的根目录(通常是嵌入式设备的根文件系统)。

用途

  • 配合交叉编译,可以将构建生成的文件按指定路径打包到目标设备的文件系统。例如:
    • 库文件可能安装到 /lib
    • 可执行文件可能安装到 /bin

执行的作用

  1. 交叉编译配置
    • 告诉 configure 脚本,我们不是在当前主机系统上编译并运行,而是为一个运行 Linux 的 ARM 嵌入式设备生成二进制文件。
  2. 指定安装路径
    • 配置脚本生成的 Makefile 会将目标安装路径设为 /,便于后续将构建的库和工具部署到目标设备的根文件系统中。

常见的后续步骤

完成配置后,通常会进行以下操作:

  1. 编译

    make
    

    使用交叉编译工具链(如 arm-linux-gnueabihf-gcc)进行编译。

  2. 安装到指定路径

    make install DESTDIR=/path/to/target/rootfs
    
    • DESTDIR 用于指定安装的目标根文件系统路径(通常是目标设备的根文件系统镜像)。

总结

这条命令配置了 tslib 库的交叉编译环境,目标是为一个运行 Linux 的 ARM 设备生成库文件,并准备安装到目标设备的根目录 / 下。

如果把后面的 --prefix=/ 去掉会怎么样?

问:如果把后面的 --prefix=/ 去掉,即像下面这样写呢:

./configure --host=arm-linux-gnueabihf

如果把 --prefix=/ 去掉,命令变为:

./configure --host=arm-linux-gnueabihf

影响分析

  1. --prefix 的默认值
    • 如果没有显式指定 --prefixconfigure 会使用默认值 /usr/local
    • 这意味着在后续执行 make install 时,构建生成的文件会被安装到以下默认路径:
      • 二进制文件:/usr/local/bin
      • 库文件:/usr/local/lib
      • 头文件:/usr/local/include
      • 其他资源文件:/usr/local/share

对交叉编译的影响

  1. 适用于主机系统的路径

    • 默认安装路径 /usr/local 是主机系统的标准路径,但在交叉编译中,这个路径通常不适用于目标设备。
    • 如果不指定目标设备的根路径(如 / 或目标文件系统的挂载点),安装的文件可能无法正确集成到目标设备的文件系统结构中。
  2. 与目标设备的根文件系统不匹配

    • 对于嵌入式设备,安装路径通常是 /(根目录),以便库和可执行文件被放置到 /lib/bin 等目录下。
    • 如果使用默认的 /usr/local,这些文件可能需要额外手动移动到目标设备的适当位置。

改动带来的结果

  • 如果你执行:
    ./configure --host=arm-linux-gnueabihf
    make
    make install DESTDIR=/path/to/target/rootfs
    
    • 构建的文件会被安装到 /path/to/target/rootfs/usr/local 中。
    • 部署时,你需要额外调整文件的位置,例如把 /usr/local/lib 下的库文件移动到 /lib,把 /usr/local/bin 下的可执行文件移动到 /bin

建议

在交叉编译中,通常需要明确指定 --prefix 为目标文件系统的根路径(例如 /)或目标文件系统的挂载点路径(例如 /path/to/target/rootfs),这样可以避免不必要的路径调整工作。

示例:

./configure --host=arm-linux-gnueabihf --prefix=/path/to/target/rootfs

总结

  • 去掉 --prefix=/ 后,configure 会使用默认路径 /usr/local,可能导致安装路径与目标设备的文件系统不匹配。
  • 如果你希望将文件正确放置在目标设备的根目录结构中,建议显式指定 --prefix=/ 或目标文件系统的挂载路径。

--prefix=/指定的路径和make install指定的路径有何区别?

在构建和安装软件时,--prefixmake install 中的 DESTDIR 是两个关键配置项,它们的作用不同,且互相独立。以下是详细区别:


1. --prefix 的作用

  • 指定安装路径的基础前缀

    • --prefix 是在运行 ./configure 脚本时指定的参数。
    • 它定义了软件安装的基础路径,最终的文件会安装到这个基础路径下的标准子目录:
      • 二进制文件:<prefix>/bin
      • 库文件:<prefix>/lib
      • 头文件:<prefix>/include
      • 数据文件:<prefix>/share
    • 默认值是 /usr/local
  • 在配置阶段生效

    • 配置脚本根据 --prefix 的值生成相应的安装路径信息,并写入 Makefile,以便在后续的 make install 阶段使用。
示例

假设指定:

./configure --prefix=/opt/myapp

然后执行 make install 后:

  • 可执行文件会安装到 /opt/myapp/bin
  • 库文件会安装到 /opt/myapp/lib
  • 头文件会安装到 /opt/myapp/include

2. DESTDIR 的作用

  • 指定临时的根路径(安装目标目录)

    • DESTDIR 是在 make install 阶段使用的,主要用来为交叉编译或打包准备。
    • 它并不会改变 --prefix 的值,而是简单地在所有安装路径的前面添加一个根路径前缀。
  • 在安装阶段生效

    • DESTDIR 通常用于将编译结果安装到某个临时目录中,例如用于创建文件系统镜像或软件包。
示例

假设:

  • ./configure --prefix=/usr
  • 执行:
    make install DESTDIR=/mnt/target
    

文件最终安装到:

  • 二进制文件:/mnt/target/usr/bin
  • 库文件:/mnt/target/usr/lib
  • 头文件:/mnt/target/usr/include

注意:DESTDIR 是在最终安装路径前面临时添加的前缀,主要用于交叉编译或构建根文件系统。


两者的主要区别

属性--prefixDESTDIR
指定方式配置阶段(./configure安装阶段(make install
作用范围定义最终的安装路径结构临时修改安装的根目录
用途指定软件安装到目标系统的基础路径指定临时安装路径(如构建根文件系统镜像)
典型场景正常编译和安装到实际系统中交叉编译或创建文件系统镜像
是否影响编译结果是(写入 Makefile否(仅影响文件复制阶段)

我结合实际案例并仔细思考后的理解:说白了,--prefix影响的是Makefile文件和make阶段,所以写到生成的那些库和文件中的路径其实是由--prefix定义的,而make install只是一种把make好的文件复制到哪里的操作。

我结合实际案例并仔细思考后的理解:说白了,--prefix影响的是Makefile文件和make阶段,所以写到生成的那些库和文件中的路径其实是由--prefix定义的,而make install只是一种把make好的文件复制到哪里的操作。

我结合实际案例并仔细思考后的理解:说白了,--prefix影响的是Makefile文件和make阶段,所以写到生成的那些库和文件中的路径其实是由--prefix定义的,而make install只是一种把make好的文件复制到哪里的操作。


结合使用示例

对于交叉编译,通常会结合使用 --prefixDESTDIR

假设目标设备的安装结构是:
  • 可执行文件放在 /bin
  • 库文件放在 /lib
配置和安装步骤:
  1. 配置阶段

    ./configure --host=arm-linux-gnueabihf --prefix=/
    
    • 指定最终目标设备的根路径为 /
    • 文件安装路径会生成为 /bin/lib 等。
  2. 安装阶段

    make install DESTDIR=/mnt/target-rootfs
    
    • 文件会被临时安装到 /mnt/target-rootfs/bin/mnt/target-rootfs/lib 等路径。
结果:

最终的目标文件系统镜像可以直接挂载到目标设备中,文件结构会正确映射到设备的 / 根目录下。


总结

  • --prefix 决定软件的最终安装路径结构,是用于配置目标设备运行环境的。
  • DESTDIR 是安装的临时根路径,主要用于交叉编译或文件系统打包,不影响软件的实际路径配置。

我结合实际案例并仔细思考后的理解:说白了,--prefix影响的是Makefile文件和make阶段,所以写到生成的那些库和文件中的路径其实是由--prefix定义的,而make install只是一种把make好的文件复制到哪里的操作。

我结合实际案例并仔细思考后的理解:说白了,--prefix影响的是Makefile文件和make阶段,所以写到生成的那些库和文件中的路径其实是由--prefix定义的,而make install只是一种把make好的文件复制到哪里的操作。

我结合实际案例并仔细思考后的理解:说白了,--prefix影响的是Makefile文件和make阶段,所以写到生成的那些库和文件中的路径其实是由--prefix定义的,而make install只是一种把make好的文件复制到哪里的操作。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

昊虹AI笔记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值