开源代码交叉编译操作流程及遇到的问题解决(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


相关文章
|
23天前
|
Linux 编译器 C语言
快速上手makefile自动化构建工具
快速上手makefile自动化构建工具
|
25天前
|
Linux 编译器 C语言
FFmpeg开发笔记(二)搭建Windows系统的开发环境
在Windows上学习FFmpeg通常较困难,但通过安装预编译的FFmpeg开发包可以简化流程。首先需要安装MSYS2来模拟Linux环境。下载并执行MSYS2安装包,然后修改msys2_shell.cmd以继承Windows的Path变量。使用pacman安装必要的编译工具。接着,下载预编译的FFmpeg Windows包,解压并配置系统Path。最后,在MSYS2环境中运行`ffmpeg -version`确认安装成功。欲深入学习FFmpeg开发,推荐阅读《FFmpeg开发实战:从零基础到短视频上线》。
32 4
FFmpeg开发笔记(二)搭建Windows系统的开发环境
|
4月前
|
JSON 开发工具 数据格式
基于Python开发的开心麻花影视作品分析系统(源码+可执行程序+程序配置说明书+程序使用说明书)
基于Python开发的开心麻花影视作品分析系统(源码+可执行程序+程序配置说明书+程序使用说明书)
|
4月前
|
数据可视化 数据挖掘 Python
基于Python开发的Excel数据分析系统(源码+可执行程序+程序配置说明书+程序使用说明书)
基于Python开发的Excel数据分析系统(源码+可执行程序+程序配置说明书+程序使用说明书)
|
前端开发 Shell 测试技术
【芯片前端】以vcs编译环境为例做一个适用于芯片前端的极简版Makefile实操教程
【芯片前端】以vcs编译环境为例做一个适用于芯片前端的极简版Makefile实操教程
680 0
|
Java Linux 开发工具
RK3399平台开发系列讲解(系统编译篇)8.6、安卓开发环境的搭建及编译
RK3399平台开发系列讲解(系统编译篇)8.6、安卓开发环境的搭建及编译
140 0
|
SQL Oracle 数据可视化
Linux应用开发: SQLite数据库交叉编译部署与运用
Linux应用开发: SQLite数据库交叉编译部署与运用
340 0
Linux应用开发: SQLite数据库交叉编译部署与运用
|
编译器 开发工具 C语言
FFmpeg开发笔记(一):ffmpeg介绍、windows开发环境搭建(mingw和msvc,无需源码编译)
FFmpeg开发笔记(一):ffmpeg介绍、windows开发环境搭建(mingw和msvc,无需源码编译)
FFmpeg开发笔记(一):ffmpeg介绍、windows开发环境搭建(mingw和msvc,无需源码编译)
|
开发工具
专接本汇编开发工具【Masm for Winodws 集成实验环境】安装细则
专接本汇编开发工具【Masm for Winodws 集成实验环境】安装细则
268 0
专接本汇编开发工具【Masm for Winodws 集成实验环境】安装细则
|
Unix 程序员 Linux
便利的开发文档工具-doxygen
进行设计时,通常有模块的概念,一个模块可能有多个类或者函数组成,完成某个特定功能的代码的集合。如何对这个概念进行注释?doxygen提供了group的概念,生成的模块的注释会单独放在一个模块的页面中。
1341 0