交叉编译相关知识整理

news/2024/11/24 9:39:35/

因为嵌入式设备的特殊性,比如其内存,性能可能相比与通用设备较弱,或者设备上缺少编译工具链等等原因,很多时候想要在嵌入式设备上使用某些程序时,需要在 在通用机器上编译好,而在嵌入式设备上运行,而这两者的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 thecompiler'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.ppmy.cn/news/57175.html

相关文章

Shell(五)Bash行操作目录堆栈

1.光标移动 Ctrl a&#xff1a;移到行首。Ctrl b&#xff1a;向行首移动一个字符&#xff0c;与左箭头作用相同。Ctrl e&#xff1a;移到行尾。Ctrl f&#xff1a;向行尾移动一个字符&#xff0c;与右箭头作用相同。Alt f&#xff1a;移动到当前单词的词尾。Alt b&#…

Github创建一个新仓库,关联本地数据并上传文件的图文步骤

工作中&#xff0c;我们经常会使用github来承享别人的代码果实&#xff0c;同时我们也会把自己的成果分享给别人&#xff0c;互相帮助。 今天的这篇图文教程非常重要&#xff0c;目标是使用Github来创建一个远程仓库&#xff0c;并和本地仓库对接&#xff0c;同时要做上传新内容…

报错解决:Could not find a package configuration file provided by “Pangolin“以及一系列问题

报错解决&#xff1a;Could not find a package configuration file provided by "Pangolin" 博主在使用cmake编译自己的工程时&#xff0c;遇到了如下报错&#xff1a; CMake Error at CMakeLists.txt:5 (find_package):By not providing "FindPangolin.cmake…

QT双缓冲机制

QT双缓冲机制 双缓冲机制介绍实现步骤绘图区实现drawwidget.h文件drawwidget.cpp文件注意Painter的无参数构造 主选项区域实现mainwindow.h文件mainwindow.cpp文件 双缓冲机制介绍 双缓冲机制&#xff0c;是指在控件绘制时&#xff0c;会首先将要绘制的内容绘制在一个图片中&am…

互联网摸鱼日报(2023-04-30)

互联网摸鱼日报&#xff08;2023-04-30&#xff09; InfoQ 热门话题 被ChatGPT带火的大模型&#xff0c;如何实际在各行业落地&#xff1f; Service Mesh的未来在于网络 百度 Prometheus 大规模业务监控实战 软件技术栈商品化&#xff1a;应用优先的云服务如何改变游戏规则…

荔枝派Zero(全志V3S)基于QT实现在LCD显示图片

文章目录 前言一、配置 buildroot 及编译二、写 QT 代码三、编译可执行文件四、拷贝到 SD 卡五、上板子测试六、资源自取 前言 有这样一个需求&#xff0c;通过配置 QT&#xff0c;在 linux 下实现显示我所想要显示的图片&#xff0c;实现的方式是我可以在命令行将图片的路径作…

Stream流中各阶段方法说明及组合示例

文章目录 常用方法Stream方法组合使用第一种介绍字符串集合可进行的操作第二种介绍int类型集合可进行的操作第三种介绍collect()和filter()组合的使用方式方法对比flatMap()和filter() Stream的创建1. 从集合或数组创建2. 使用Stream.of()创建3. 使用Stream.iterate()创建4. 使…

Go语言——【高质量编程 | 代码规范】

作者&#xff1a;非妃是公主 专栏&#xff1a;《Golang》 博客主页&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 一、高质量编程定义 二、代码规范1. 代码格式…