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


相关文章
|
2月前
|
API 开发工具 Android开发
从安装到打包,手把手教你如何在Uno Platform上部署跨平台应用——一篇详尽的开发者指南
【9月更文挑战第7天】Uno Platform 是一个跨平台应用开发框架,利用UWP API构建Web、iOS、Android等多平台应用。本文详述了安装Uno Platform SDK、配置项目支持跨平台、添加主方法以及使用命令行工具进行应用打包的过程,助您快速上手 Uno Platform 并部署应用。通过简单的代码示例,让开发者轻松掌握从安装到发布的核心步骤。
165 2
|
5月前
|
前端开发 Oracle Java
编程开发软件工具下载
编程开发软件工具下载
36 0
|
6月前
|
数据可视化 数据挖掘 Python
基于Python开发的Excel数据分析系统(源码+可执行程序+程序配置说明书+程序使用说明书)
基于Python开发的Excel数据分析系统(源码+可执行程序+程序配置说明书+程序使用说明书)
145 0
|
6月前
|
JSON 开发工具 数据格式
基于Python开发的开心麻花影视作品分析系统(源码+可执行程序+程序配置说明书+程序使用说明书)
基于Python开发的开心麻花影视作品分析系统(源码+可执行程序+程序配置说明书+程序使用说明书)
|
SQL Oracle 数据可视化
Linux应用开发: SQLite数据库交叉编译部署与运用
Linux应用开发: SQLite数据库交叉编译部署与运用
398 0
Linux应用开发: SQLite数据库交叉编译部署与运用
Keil uVision5软件的操作与编写基础(入门)
一、如何新建一个空白文档 1.打开Keil uVision5,将会出现工作界面。如图所示: 2.点击【project】选项,再去点击【New uVision project...】选项。如图所示: 打开之后,会弹出一个界面。这时我们点击【新建文件夹】,我们先将新建的文件夹重命名为001. 打开001这个文件夹,并且将文件名命名为002。如图所示: 此时会弹出一个新界面Select Device for Target 'Target 1',这时候我们选择下图中的Atmel,然后再去找到AT89C51。 3.点击工作界面左上角的白色小纸(New),如图所示: 4. 然后保存这个文档,点击左上角的
1262 0
Keil uVision5软件的操作与编写基础(入门)
|
Ubuntu 网络安全 数据安全/隐私保护
鸿蒙系统环境搭建、源码编译与烧写之经典
大家好,今天学习一下,如何部署鸿蒙环境,并在ubuntu系统下编译,以及烧写镜像的方法。 目录
406 0
鸿蒙系统环境搭建、源码编译与烧写之经典
|
开发工具
专接本汇编开发工具【Masm for Winodws 集成实验环境】安装细则
专接本汇编开发工具【Masm for Winodws 集成实验环境】安装细则
304 0
专接本汇编开发工具【Masm for Winodws 集成实验环境】安装细则
|
开发工具 数据安全/隐私保护 git
源代码管理工具的简介
源代码管理工具的简介
240 0
|
存储 jenkins 持续交付
自己动手设计一款iOS自动构建发布工具
自己动手设计一款iOS自动构建发布工具
330 0
自己动手设计一款iOS自动构建发布工具