当前位置: 首页 > article >正文

交叉编译相关知识整理

因为嵌入式设备的特殊性,比如其内存,性能可能相比与通用设备较弱,或者设备上缺少编译工具链等等原因,很多时候想要在嵌入式设备上使用某些程序时,需要在 在通用机器上编译好,而在嵌入式设备上运行,而这两者的cpu架构是不同的,因而需要好好整理下交叉编译。

构建期间相关知识

查看搜索库的路径

aarch64-linux-gcc -print-search-dirs

查询某个库的路径

使用选项-print-file-name=<lib_name>
如列出libstdc++.so.6的库路径:

aarch64-linux-gcc -print-file-name=libstdc++.so.6

使用目标板的库

在configure时

--with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
                          compiler's sysroot if not specified).

我理解是指定目标板根路径,头文件和库将在这里寻找。

--with-build-sysroot=SYSROOT use sysroot as the system root during the build

最终安装的根目录
待确认

gcc选项

aarch64-linux-gcc有此选项:

--sysroot=<directory>    Use <directory> as the root directory for headers and libraries.

编译构建运行期间相关命令

pkg-config

NAME
pkg-config - Return metainformation about installed libraries

除了在命令行上指定包名之外,还可以给出给定.pc文件的完整路径。这允许用户直接查询特定的.pc文件。
–cflags 这将打印在命令行上编译包所需的预处理器和编译标志,包括它们所有依赖项的标志。标志被“压缩”,因此每个相同的标志只出现一次。如果Pkg-config在命令行上找不到一个或多个包的元数据,则使用非零代码退出。
–libs 该选项与"——cflags"相同,只是它打印链接标志。与“——cflags”一样,重复的标志被合并(保持适当的顺序),并且依赖项的标志包含在输出中。
–static 为静态链接输出链接标志
–list-all 列出所有在pkg-config路径发现的模块

可以通过环境变量PKG_CONFIG_PATH来设置 pkg-config的额外搜索路径,pkg-config工具将按照设置路径的先后顺序进行搜索,直到找到指定的.pc文件为止。
需要注意的是,在交叉编译时,目标板的pkg-config输出结果只是针对目标板的,使用可能会有问题,可以设置PKG_CONFIG_SYSROOT_DIR为目标板的根目录,pkg-config则会在pc文件中得到的路径加上前缀$PKG_CONFIG_SYSROOT_DIR,处理后的路径可以正确定位到库文件和头文件的位置。

libtools

以.la为后缀的文件,后面再整理

ldconfig

NAME
ldconfig - configure dynamic linker run-time bindings

SYNOPSIS
/sbin/ldconfig [-nNvXV] [-f conf] [-C cache] [-r root] directory…
/sbin/ldconfig -l [-v] library…
/sbin/ldconfig -p

ldconfig 命令的用途,主要是在默认搜寻目录(/lib 和 /usr/lib)以及动态库配置文件(/etc/ld.so.conf)内所列的目录下,搜索出可共享的动态链接库(lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。
Linux下的共享库机制采用了类似于高速缓存的机制,将库信息保存在 /etc/ld.so.cache 里边。程序连接的时候首先从这个文件里边查找,然后再到 ld.so.conf 的路径里边去详细找。这就是为什么修改了 ld.so.conf 要重新运行一下 ldconfig 的原因。
如果是在自定义库的lib,需要修改/etc/ld.so.conf,或者添加路径到LD_LIBRARY_PATH
常见选项:
(1) -v或–verbose : 用此选项时,ldconfig将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字。
(2) -n : 用此选项时,ldconfig仅扫描命令行指定的目录,不扫描默认目录(/lib,/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录.
(3) -N : 此选项指示ldconfig不重建缓存文件(/etc/ld.so.cache)。若未用-X选项,ldconfig照常更新文件的连接。
(4) -X : 此选项指示ldconfig不更新文件的连接。若未用-N选项,则缓存文件正常更新。
(5) -f CONF : 此选项指定动态链接库的配置文件为CONF,系统默认为/etc/ld.so.conf。
(6) -C CACHE : 此选项指定生成的缓存文件为CACHE,系统默认的是/etc/ld.so.cache,此文件存放已排好序的可共享的动态链接库的列表。
(7) -r ROOT : 此选项改变应用程序的根目录为ROOT(是调用chroot函数实现的)。选择此项时,系统默认的配置文件 /etc/ld.so.conf,实际对应的为 ROOT/etc/ld.so.conf。如用-r /usr/zzz时,打开配置文件 /etc/ld.so.conf时,实际打开的是/usr/zzz/etc/ld.so.conf文件,用此选项,可以大大增加动态链接库管理的灵活性。
(8) -l : 通常情况下,ldconfig搜索动态链接库时将自动建立动态链接库的连接。仅供专业人士使用。
(9) -p或–print-cache : 此选项指示ldconfig打印出当前缓存文件所保存的所有共享库的名字。
(10) -c FORMAT 或 --format=FORMAT : 此选项用于指定缓存文件所使用的格式,共有三种:ld(老格式),new(新格式)和compat(兼容格式,此为默认格式)。
(11) -V : 此选项打印出ldconfig的版本信息,而后退出。
(12) -? 或 --help 或 --usage : 这三个选项作用相同,都是让ldconfig打印出其帮助信息,而后退出。
参考资料:
–with-sysroot and --with-build-sysroot
内核交叉编译
编译时动态库名与运行时查找的不一样
pkg-config用法详解
交叉编译中pkg-config和libtool设置
ldconfig 命令用法
Linux library查找顺序(按优先级排列)
LIBRARY_PATH和LD_LIBRAY_PATH的区别和用法
libtool介绍


http://www.kler.cn/a/16066.html

相关文章:

  • 【eNSP】路由基础与路由来源——静态路由实验
  • Linux 实现自动登陆远程机器
  • 计算机毕业设计Python+大模型中医养生问答系统 知识图谱 医疗大数据 中医可视化 机器学习 深度学习 人工智能 大数据毕业设计
  • css中的变量使用
  • 【视觉SLAM】1-概述
  • LaTeX之四:如何兼容中文(上手中文简历和中文论文)、在win/mac上安装新字体。
  • 安装Ubuntu22.04虚拟机的一些常见问题解决方法
  • 客户管理系统的作用有哪些?
  • Go分布式爬虫(二十四)
  • 这就是二分查找?(C语言版)
  • 【python】用ChatGPT使用爬虫
  • Python调用最小二乘法
  • PyQt6: 多网卡适配器的选择与显示(GPT4帮写)
  • 数据血缘落地方案
  • 【C++进阶知识】C++虚函数和虚函数表
  • verilog手撕代码3——序列检测和序列发生器
  • notepad++安装HexEditor插件查看二进制文件
  • 【C++】程序员必备知识:认识类与对象
  • nginx的proxy_pass路径转发规则浅析
  • 共创共建共享,2023北京老博会陪伴企业成长宣传计划开启
  • 使用chatGPT开发获取格点天气数据
  • YOLOv5代码解析——模型结构篇
  • 软件设计证书倒计时28天
  • 免费的绘图工具DrowIO下载及安装
  • 2 异或位运算大厂必刷题
  • 人不成熟的五大特征-读后感