对一个实例的分析
交叉编译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。
- 库文件可能安装到
执行的作用
- 交叉编译配置:
- 告诉
configure脚本,我们不是在当前主机系统上编译并运行,而是为一个运行 Linux 的 ARM 嵌入式设备生成二进制文件。
- 告诉
- 指定安装路径:
- 配置脚本生成的
Makefile会将目标安装路径设为/,便于后续将构建的库和工具部署到目标设备的根文件系统中。
- 配置脚本生成的
常见的后续步骤
完成配置后,通常会进行以下操作:
-
编译:
make使用交叉编译工具链(如
arm-linux-gnueabihf-gcc)进行编译。 -
安装到指定路径:
make install DESTDIR=/path/to/target/rootfsDESTDIR用于指定安装的目标根文件系统路径(通常是目标设备的根文件系统镜像)。
总结
这条命令配置了 tslib 库的交叉编译环境,目标是为一个运行 Linux 的 ARM 设备生成库文件,并准备安装到目标设备的根目录 / 下。
如果把后面的 --prefix=/ 去掉会怎么样?
问:如果把后面的 --prefix=/ 去掉,即像下面这样写呢:
./configure --host=arm-linux-gnueabihf
如果把 --prefix=/ 去掉,命令变为:
./configure --host=arm-linux-gnueabihf
影响分析
--prefix的默认值- 如果没有显式指定
--prefix,configure会使用默认值/usr/local。 - 这意味着在后续执行
make install时,构建生成的文件会被安装到以下默认路径:- 二进制文件:
/usr/local/bin - 库文件:
/usr/local/lib - 头文件:
/usr/local/include - 其他资源文件:
/usr/local/share
- 二进制文件:
- 如果没有显式指定
对交叉编译的影响
-
适用于主机系统的路径:
- 默认安装路径
/usr/local是主机系统的标准路径,但在交叉编译中,这个路径通常不适用于目标设备。 - 如果不指定目标设备的根路径(如
/或目标文件系统的挂载点),安装的文件可能无法正确集成到目标设备的文件系统结构中。
- 默认安装路径
-
与目标设备的根文件系统不匹配:
- 对于嵌入式设备,安装路径通常是
/(根目录),以便库和可执行文件被放置到/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指定的路径有何区别?
在构建和安装软件时,--prefix 和 make 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是在最终安装路径前面临时添加的前缀,主要用于交叉编译或构建根文件系统。
两者的主要区别
| 属性 | --prefix | DESTDIR |
|---|---|---|
| 指定方式 | 配置阶段(./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好的文件复制到哪里的操作。
结合使用示例
对于交叉编译,通常会结合使用 --prefix 和 DESTDIR:
假设目标设备的安装结构是:
- 可执行文件放在
/bin - 库文件放在
/lib
配置和安装步骤:
-
配置阶段:
./configure --host=arm-linux-gnueabihf --prefix=/- 指定最终目标设备的根路径为
/。 - 文件安装路径会生成为
/bin、/lib等。
- 指定最终目标设备的根路径为
-
安装阶段:
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好的文件复制到哪里的操作。

被折叠的 条评论
为什么被折叠?



