开源代码交叉编译操作流程及遇到的问题解决(lightdm)

简介: 开源代码交叉编译操作流程及遇到的问题解决(lightdm)

开源代码交叉编译操作流程及遇到的问题解决(lightdm)

操作流程

x86_64本机交叉编译aarch64架构的开源库

遇到的问题及解决办法

如果服务器安装了open-ssh,然后发现客户端无法连接,并出现了 `onnection reset by (server_ip_address) port 22`

Configure error: Python headers not found

linux下镜像文件扩容的方法

pkg_config_path 环境变量设置

【GitHub】克隆速度非常慢的解决方法。

执行make命令时出现以下错误信息:

intltool 版本过低问题


操作流程

主要流程如下,首先将构建好的模板板子上的文件系统镜像进行挂载,并利用 qemu + chroot 进入 arm 文件系统中,具体操作如下:


  1. 文件系统镜像文件为 rootfs.img ,挂载路径为 /home/jw/disk_2/rk356x_rootfs/rootfs ,可以构建如下的脚本方便每次挂载使用,具体内容如下:
  • automount.sh
ARM_ROOTFS=/home/jw/disk_2/rk356x_rootfs/rootfs
ROOTFS_FILE=./rootfs.img
sudo mount -o loop ${ROOTFS_FILE} ${ARM_ROOTFS}
sudo mount -o bind /dev ${ARM_ROOTFS}/dev
sudo mount -o bind /dev/pts ${ARM_ROOTFS}/dev/pts
sudo mount -o bind /proc ${ARM_ROOTFS}/proc
sudo mount -o bind /sys ${ARM_ROOTFS}/sys


  1. 使用 chroot 命令切换到目标文件系统中,具体如下
$ sudo chroot /home/jw/disk_2/rk356x_rootfs/rootfs /bin/bash


  1. 此时就可以通过正常的 apt 命令来安装目标文件系统镜像中的库,当有一些库在 apt 源中不存在时,也可以在这个虚拟文件系统中进行编译,具体操作跟正常的 x86_64 主机上编译源码方式相同,这里就不多说了。
  2. 当我们需要源代码时,可以使用 apt source libxxx 的方式获取 apt deb包的源代码库,我本次编译主要目标是 lightdm 库,所以这里我操作如下:
# apt source lightdm


  1. 当获取到源代码后,就可以进入源代码路径下,采用 autogen.sh 或者 configure 等自动构建工具完成项目构建和编译了。

x86_64本机交叉编译aarch64架构的开源库

前一步,我们在板子上获取到了对应的开源代码,但是如果我们需要更快速的编译目标,可以在本机上使用交叉编译工具进行交叉编译(缺点就是如果编译目标依赖大量的第三方库,我们也需要配置对应的库环境)。针对交叉编译依赖问题,我们可以通过将目标文件系统挂载的方式,将需要连接的库路径指向挂载的文件系统中,这样就能解决大量的依赖库问题,具体操作如下:


挂载 arm 文件系统镜像到 /home/jw/disk_2/rk356x_rootfs/rootfs 路径下,具体操作参考前一步

  1. 找到交叉编译工具链所在的路径,我这里所用到的交叉编译工具 aarch64-linux-gnu-gcc 所处目录在 /home/jw/disk_2/Code/rk356x-linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/ 。
  2. 根据自身环境和编译库的 configure 参数,具体参数可以参考目标库下的debian/rules 文件,该文件是构建 deb 包所需的重要文件,编写自动构建编译脚本,具体脚本内容如下:
  • auto_build.sh


MY_SYSROOT="/home/jw/disk_2/rk356x_rootfs/rootfs"
COMM_FLAGS="--sysroot=$MY_SYSROOT \
                -Wl,-rpath-link=$MY_SYSROOT/lib/aarch64-linux-gnu \
                        -Wl,-rpath-link=$MY_SYSROOT/usr/lib/aarch64-linux-gnu "
export PATH=/home/jw/disk_2/Code/rk356x-linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/:$PATH
export CC="aarch64-linux-gnu-gcc "
export CXX="aarch64-linux-gnu-g++ "
export PKG_CONFIG_PATH="$MY_SYSROOT/usr/lib/aarch64-linux-gnu/pkgconfig:$MY_SYSROOT/usr/lib/pkgconfig:$MY_SYSROOT/usr/share/pkgconfig"
export PKG_CONFIG_LIBDIR="$MY_SYSROOT/usr/lib/aarch64-linux-gnu/pkgconfig"
export PKG_CONFIG_SYSROOT_DIR="$MY_SYSROOT"
export CPPFLAGS="-Wdate-time -DPRE_RELEASE=0 -fPIC  $COMM_FLAGS"
export CFLAGS="-I/home/jw/disk_2/rk356x_rootfs/rootfs/usr/include -I/home/jw/disk_2/rk356x_rootfs/rootfs/usr/lib/aarch64-linux-gnu/glib-2.0/include -g -O0 -Wformat -fPIC $COMM_FLAGS"
export CXXFLAGS="-g -O0 -Wformat -fPIC  $COMM_FLAGS"
export LDFLAGS="-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic  $COMM_FLAGS"
export LIBS="-ldl"
#../configure --host=aarch64 --with-greeter-user=lightdm --with-user-session=lightdm-xsession --disable-silent-rules --enable-liblightdm-qt5 --prefix=/home/jw/disk_2/Code/third/install-pack/
../configure -v \
        --build=x86_64-linux-gnu \
        --host=aarch64-linux-gnu \
        --with-sysroot=${MY_SYSROOT} \
        --prefix=${MY_SYSROOT}/usr/ww \
        --with-pkgversion='Debian 8.3.0-6'\
        --with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs \
        --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ \
        --with-gcc-major-version-only \
        --program-suffix=-8 \
        --program-prefix=aarch64-linux-gnu- \
        --enable-shared \
        --with-pic=pulsecore \
        --enable-linker-build-id \
        --libexecdir=/usr/lib \
        --without-included-gettext \
        --enable-threads=posix \
        --libdir=/usr/lib \
        --enable-nls \
        --enable-bootstrap \
        --enable-clocale=gnu \
        --enable-libstdcxx-debug \
        --enable-libstdcxx-time=yes \
        --with-default-libstdcxx-abi=new \
        --enable-gnu-unique-object \
        --disable-libquadmath \
        --disable-libquadmath-support \
        --enable-plugin \
        --enable-default-pie \
        --with-system-zlib \
        --disable-libphobos \


执行脚本 auto_build.sh


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKZgeOip-1640832604325)(en-resource://database/831:1)]


遇到的问题及解决办法

1.pkg-config

pkg-config工具方便了编译的头文件、库文件的路径设置,它利用pc文件保存头文件、库文件和库依赖的相关信息。
    在交叉编译环境中,目标板的pc文件中保存的路径信息可能只是相对于目标板的根目录(nfs挂载目录)的路径,这样在主机端交叉编译时,pkg-config得到的路径无法正确定位到目标板上的交叉编译的库文件和头文件,编译无法正确进行。利用pkg-config环境变量PKG_CONFIG_SYSROOT_DIR可以较好解决这个问题,设置PKG_CONFIG_SYSROOT_DIR为目标板的根目录,pkg-config则会在pc文件中得到的路径加上前缀$PKG_CONFIG_SYSROOT_DIR,处理后的路径可以正确定位到库文件和头文件的位置。


2.Libtool


 

Libtool工具可以在不同的平台中方便建立动态链接库,它隐藏了一些底层细节。libtool利用la文件记录库的位置和依赖关系,和上面的问题类似,在交叉编译环境中,它存放的是相对于目标板的根目录的路径,交叉编译会出现问题,貌似对于libtool的这种问题没有比较简单的解决方案,但修改la文件中的目录位置可以解决此种问题,主要修改la文件中的两处位置
dependency_libs:保存的是库的依赖关系,修改为主机端的绝对路径
libdir:保存的是库文件的位置,修改为主机端的绝对路径
SSH无法连接之"connection reset by ip_address port 22"问题解决


如果服务器安装了open-ssh,然后发现客户端无法连接,并出现了 onnection reset by (server_ip_address) port 22

如果遇到上述问题,那说明在当前机器上对于 open-ssh 的安装并不完整,所以最好重置 ssh 的配置,具体操作如下:


$ sudo rm /etc/ssh/ssh_host_*
$ sudo dpkg-reconfigure openssh-server


Configure error: Python headers not found

在执行 configure 时因为找不到 Python 头文件报错,可以执行如下命令解决:


$ sudo apt-get install python-dev   # for python2.x installs
$ sudo apt-get install python3-dev  # for python3.x installs


linux下镜像文件扩容的方法

在前面挂载的文件系统镜像后,当我们通过 apt 安装了大量的库环境后就会发现可用的空间越来越少,到最后一点空间都没有了,这时候就需要进行镜像文件的扩容操作了,具体操作如下:


  1. 创建一个10M大小的文件


#dd if=/dev/zero of=/add.img bs=1M count=10


  1. 把这个文件关联成一个块设备
#losetup /dev/loop0 /add.img


  1. 查看关联是否成功
# losetup -a
/dev/loop0: [fd00]:173960 (/add.img)


  1. 把它格式化成ext3文件系统
#mkfs.ext3 /dev/loop0


5,卸载关联关系,再查看


#losetup -d /dev/loop0
#losetup -a


6.给原img文件增加空间

注意:这里是>>符号来追加,不是>,>是新写入!!


#cat /add.img >> /old.img


扫描检查

#e2fsck -f /old.img


重新设置其大小属性

#resize2fs /old.img


9.最后把扩容后的镜像挂载,用df -h查看会发现已经完成了镜像文件的扩容


pkg_config_path 环境变量设置

一、查看 pkg_config_path 环境变量

命令


root@kali:~# echo $PKG_CONFIG_PATH


从上面可以清楚的看到我的“ pkg_config_path 环境变量”是空的。


二、查看自己的 pkgconfig 路径在哪里?


root@kali:~# find / -name pkgconfig


可以清楚的看到有三个pkgconfig路径:/usr/share/pkgconfig、/usr/lib/pkgconfig、/usr/lib/x86_64-linux-gnu/pkgconfig,自己看着去选吧!我建议大家选择前两个任意一个。


三、设置 pkg_config_path 环境变量


方法有两种方法都可以设置 pkg_config_path 环境变量 。

1、如果你只是想加上某库的pkg,只需要用如下命令:


root@kali:~# export PKG_CONFIG_PATH=/usr/lib/pkgconfig/


2、如果你想覆盖掉原来的pkg,可选择用此方法。因为PKG_CONFIG_LIBDIR的优先级比 PKG_CONFIG_PATH 高,所以会覆盖PKG_CONFIG_PATH的设置。


root@kali:~# export PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig/


也可以使用如下命令,注意一定要放在 PKG_CONFIG_PATH 的前面,这样才能首先读取。


root@kali:~# export PKG_CONFIG_PATH=/usr/lib/pkgconfig/:$PKG_CONFIG_PATH


【GitHub】克隆速度非常慢的解决方法。

原地址:
    https://github.com/FanCiyuan/macrozheng.git
替换后的地址:
   https://github.com.cnpmjs.org/FanCiyuan/macrozheng.git


执行make命令时出现以下错误信息:

DPATH="${ZSH_VERSION+.}:" && cd . && /bin/bash /home/jiajia/libuuid-1.0.3/libuuid-1.0.3/missing aclocal-1.13 
/home/jiajia/libuuid-1.0.3/libuuid-1.0.3/missing: 行 81: aclocal-1.13: 未找到命令
WARNING: 'aclocal-1.13' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>
Makefile:424: recipe for target 'aclocal.m4' failed
make: *** [aclocal.m4] Error 127


  • 问题核心:
'aclocal-1.13' is missing on your system.


  • 解决办法
autoreconf -ivf


intltool 版本过低问题

参考链接


由于 intltool 版本过低,需要更新,但是参考网上描述的更新方式:


wget http://ftp.gnome.org/pub/gnome/sources/intltool/0.40/intltool-0.40.6.tar.gz
tar zxvf intltool-0.40.6.tar.gz
cd intltool-0.40.6
./configure
make && make install


但是更新后结果发现,intltool-update 无法正常执行。


/usr/bin/intltool-update 
Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/^(.*)\${ <-- HERE ?([A-Z_]+)}?(.*)$/ at /usr/bin/intl


参考前面的参考链接,修改 intltool-update 脚本文件中的部分字符即可完成。

8941d71569b74896bb913110de0ef3a6.png52e04488d7d34608b0695010c2a03439.png


相关文章
|
人工智能 文字识别 计算机视觉
【AAAI 2024】M2Doc:文档版面分析的可插拔多模态融合方法
M2Doc是一种创新的多模态融合方法,设计用于增强文档版面分析任务中的纯视觉目标检测器。该方法包括Early-Fusion和Late-Fusion模块,前者通过门控机制融合视觉和文本特征,后者则在框级别合并这两种特征。M2Doc易于集成到各种目标检测器,实验证明它能显著提升DocLayNet和M6Doc数据集上的性能,特别是与DINO结合时,在多个数据集上达到SOTA结果。此外,研究表明M2Doc对于增强复杂逻辑版面分析任务中的文本理解和语义关联特别有效。
|
存储 编解码 数据可视化
揭秘GB28181标准下如何打造超能执法记录仪,引领警务新时代!
【10月更文挑战第3天】GB28181是中国公共安全行业标准,对智慧可视化指挥控制系统建设至关重要。本文探讨了如何在该标准下设计符合现代警务需求的执法记录仪,包括环境准备、引入依赖、SDK初始化、视频采集与编码、存储与传输等关键技术环节,并提供了具体的设计思路和代码示例,助力实现高效稳定的指挥调度功能。
340 3
|
安全 Ubuntu Linux
6 个受欢迎且好用的轻量级Linux桌面环境
Linux被认为是最安全的系统,但这并不意味着它不受恶意软件或其他安全漏洞的侵害。Linux系统的使用范围非常广泛,因此防范潜在威胁至关重要。在这里,将探索 2024 年适用于 Linux 的最佳防病毒软件。根据评级、功能以及与其他 Linux 发行版的兼容性列出了十款最佳防病毒软件,内容仅供分享,不做其它用途。
3901 1
6 个受欢迎且好用的轻量级Linux桌面环境
|
编解码 Linux API
从FFplay到自定义播放器:构建高性能多媒体应用程序的进阶之路
【10月更文挑战第15天】多媒体应用程序的开发是一个复杂的过程,尤其是在追求高性能和定制化体验时。本文将引导你从使用FFplay作为起点,逐步过渡到构建一个完全自定义的播放器。我们将探讨FFmpeg库的高级用法、多媒体同步原理、跨平台开发注意事项,以及如何实现用户界面与音视频解码的无缝集成。
422 1
|
安全 Linux
Linux中ldd命令的依赖复制技巧
`ldd`命令的依赖复制技巧在特定的场合下非常有用,但它也需要细心的处理和充分的测试,以确保在新环境中的稳定运行。此外,这种做法虽然方便,但在长期维护和安全更新方面可能会带来额外的负担。
340 0
|
编译器 Linux 开发者
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
1966 0
|
存储 计算机视觉 C++
OpenCV—HighGUI图形用户界面初步
OpenCV—HighGUI图形用户界面初步
290 2
|
NoSQL
编译和安装 libvirt 8.10.0
编译和安装 libvirt 8.10.0
881 0
|
C语言
C语言——字符串大小写互换
C语言——字符串大小写互换
422 0
|
编解码 监控 算法
嵌入式linux下的FFmpeg交叉编译(最全面)
嵌入式linux下的FFmpeg交叉编译(最全面)

热门文章

最新文章