IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> QT4.8.6的交叉编译 - 编译平台:Ubuntu 20.04 LTS,目标平台:linux/imx6ull -> 正文阅读

[系统运维]QT4.8.6的交叉编译 - 编译平台:Ubuntu 20.04 LTS,目标平台:linux/imx6ull

版本记录表

开发环境

  • 编译环境: 64位Ubuntu 20.04 LTS
  • 交叉编译工具链: arm-linux-gnueabihf-GCC 4.9.1
  • 本地编译器:gcc version 7.5.0 (Ubuntu 7.5.0-6ubuntu2)
  • QT版本: qt-4.8.6
  • 硬件平台: i.mx6ull
  • 编译所需的包为: ARM-Linux-GCC-4.9.1.tar.bz2, tslib-1.4.tar.gz, qt-everywhere-opensource-src-4.8.6.tar.gz

项目地址(不开源)

Qt-everywhere-opensource源码: Index of /archive

特别说明1

笔者已经在Ubuntu 16.04, 18.04, 20.04三个版本中成功实现Qt的交叉编译,但这并不说明本项目是与Linux版本无关的。目前确定的是本机的gcc/g++编译器版本会影响编辑的结果。例如Ubuntu 20.04LTS系统自带的gcc编译器版本为9.3.0,使用这个版本的编译器是无法完成Qt的交叉编译的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E94k6E09-1626352525518)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/606aa1e6-7812-4244-93f3-631b56261c63/Untitled.png)]

为了解决这个问题,应当安装gcc-7编译器:

sudo apt install gcc-7 g++-7
gcc-7 -v

可以设置系统默认的gcc/g++编译器版本号,也可以在qt源码的mkspecs中更改默认的编译器:QMAKE_CC = gcc-7

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EfN25kxz-1626352525520)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e30e9130-7fb1-4eef-af45-b2e6c0936e5c/Untitled.png)]

特别说明2

在Qt mkspecs中选择合适的平台并修改交叉编译的选项。

  • 进入**qt-everywhere-opensource-src-4.8.6/mkspecs/qws/linux-arm-g++**目录
  • 修改qmake.conf文件:arm-linux → arm-linux-gnueabihf -lts (-lts是因为使用了tslib库)
  • 配置Qt编译选项时,需要使用**-xplatform qws/linux-arm-g++**选项指定我们调整过的mkspecs

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9o8KrPTq-1626352525521)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/54272f33-cd50-44f4-a019-54bce74746ff/Untitled.png)]

如果在后面程序的编译过程中(加载插件、调用动态库)出现了如下类似报错:

The plugin ‘/usr/lib/libEWhalesInputMethodPro.so’ uses incompatible Qt library. Expected build key “arm linux gnueabihf-g++ no-pkg-config”, got “arm linux g++ no-pkg-config”:

则需要检查源码中对QT_BUILD_KEY的定义,修改qt-everywhere-opensource-src-4.8.6/src/corelib/global/ qglobal.h文件:

  • #define QT_BUILD_KEY "arm linux g++ no-pkg-config"改为#define QT_BUILD_KEY "arm linux gnueabihf-g++ no-pkg-config"
  • #define QT_BUILD_KEY_COMPAT3 "armv6 linux g++ no-pkg-config"改为#define QT_BUILD_KEY_COMPAT3 "armv6 linux gnueabihf-g++ no-pkg-config"

如果已经编译完成,则可以直接修改**<QtCore/qconfig.h>**头文件,修改的内容与上述文件相同。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uJs8llPo-1626352525521)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6d93cf2a-676a-406f-b6f0-29b800e918fa/Untitled.png)]

特别说明3

从笔者的交叉笔译实战来看,能解决编译过程中遇到问题的关键在于了解Qt从源代码编译成可以部署到嵌入式系统中的过程。这个过程分为两个核心的部分,分别使用了本地编译器与交叉编译工具链,任何一个环节出错都可能导致最终的编译失败,而且这种出错不一定是显性报错的。举例说明:

进行第一阶段编译时,生成的Qt-tools可执行程序位于bin文件夹。其中,uic程序是用来将页面设计文件(.ui)转化为对应的头文件(.h)。如果本地编译器GCC的版本为V9.3,程序会工作异常,导致页面设计相关的头文件出错,进而使得后续的Qt-opensource源码编译过程出错。如果将编译器版本换成GCC-V7,则uic程序运行正常,Qt源码可以正常编译。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X6EGLVmi-1626352525522)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/dae013a7-4095-4bb8-9635-54a9feecb27d/Qt_cross_compile.png)]

快速开始

设置工具链

若采用最新的CrossCompileDev工具包进行开发环境配置,则:

  • 进入CrossCompileDev文件夹,修改”. startwork.sh”脚本中的WORKDIR路径为当前文件夹的位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CWu4hAwU-1626352525522)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/3a36a088-cd74-46e6-82b2-f821a3055875/Untitled.png)]

  • 执行”. startwork.sh”脚本快速配置开发环境
. startwork.sh

同时在CrossCompileDev/tools/tslib-1.4中有已经交叉编译好的tslib库,因此步骤1~2可以直接跳过。若直接采用alwhales工业平板电脑进行开发,则关于tslib库和Qt库移植到开发板的步骤(步骤6)可以省略。

最为关键和必不可少的步骤为:3. qt4.8.6的交叉编译, 进入CrossCompileDev/tools/CrossCompileQt /qt-4.8.6-source文件夹中,修改build_arm_qt.sh脚本中开头的两处路径配置,然后直接运行该脚本就可以快速完成Qt的交叉编译与安装。需要特别说明的是,每次的Qt交叉编译工作开始前,请确保Qt源码处于未经配置的原始状态,最简单的做法是删除原来的源码qt-everywhere-opensource-src-4.8.6,然后从原始代码压缩文件中再解压一份。或者进入qt-everywhere-opensource-src-4.8.6文件夹,然后运行make clean

一般流程

1. 交叉工具链的安装

将资料包中的4.9.1.tar.bz2解压到/opt/arm-gcc下(目录随自己喜好,本文以此为例),会在/opt/arm-gcc目录下出现目录4.9.1,解压命令如下:

$ sudo tar -jxvf 4.9.1.tar.bz2 -C /opt/arm-gcc/

添加环境变量,在/etc/profile文件的末尾添加

export PATH=$PATH:/opt/arm-gcc/4.9.1/bin

然后命令行使设置立即生效

$ source /etc/profile

可以在命令行敲arm加上tab键,查看环境设置是否生效,如果生效,如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lsv08EtM-1626352525523)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0370b21f-d456-4d0f-8c40-4efff01fb36c/image3.png)]

查看当前的arm-gcc的版本:

$ arm-linux-gcc –v

如果找不到可以:

$arm-linux-gnueabihf -v

如果出现缺少共享库文件,安装即可。

2. ts库的交叉编译

创建工作目录,

$ mkdir /home/alwhales/CrossCompileDev/tslib-1.4 -p (/home/li/为我的用户主目录)

复制tslib-1.4.tar.gz到此目录:

进入此目录,并解压tslib-1.4.tar.gz,

$ cd /home/alwhales/CrossCompileDev/tslib-1.4

$ tar -zxvf tslib-1.4.tar.gz

进入解压出来的tslib目录,,

$ cd tslib

安装编译所需的一些库,

$ sudo apt-get install autoconf automake libtool

$ sudo apt-get install g++-multilib libx11-dev libxext-dev libxtst-dev zlib1g-dev lib32ncurses5 lib32z1 libpng-dev

设置ts库的存放路径,

$ export PREFIX=/home/alwhales/CrossCompileDev/tools/tslib-1.4/lib-arm

生成configure脚本,

$ ./autogen.sh

清除上次编译信息、屏蔽一些没用的编译错误信息:

make distclean
rm arm-linux.cache
echo "ac_cv_func_malloc_0_nonnull=yes">arm-linux.cache

编译配置:

$ ./configure --host=arm-linux --prefix=$PREFIX --cache-file=arm-linux.cache

开始编译:

$ sudo make

创建一个放置待会编译出来的可移植库的目录lib-arm,这个库会在编译qt的时候用,

$ mkdir lib-arm

安装到/home/li/QT/tslib-1.4/ lib-arm,

$ sudo make install

编译成功后在/home/li/QT/tslib-1.4/lib-arm下产生bin、etc、include、lib 4个文件夹,修改这里的etc/ts.conf,打开之前屏蔽掉的module variance delta=30

然后查看编译器的版本:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1IbgDOV7-1626352525523)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4817dd4c-2c2e-425d-9882-78f919b28371/image4.png)]

此时ts库的编译就完成了,接下来就可以编译qt了,下面说明下如何移植ts库到开发板上。

1 将/home/li/QT/tslib-1.4/lib-arm下的几个文件夹拷贝到arm文件系统的/opt/tslib-1.4

2 设置环境变量脚本tslib.sh,脚本位置在/etc/profile.d/目录下,如下图所示:

#!/bin/sh
TSLIB=/opt/tslib-1.4
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CONFFILE=$TSLIB/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB/lib
export PATH=$PATH:$TSLIB/bin

3 启动arm板,命令行下执行脚本

source tslib.sh

  1. 在开发板上tslib-1.4/etc目录下的ts.conf的“#module_raw input”的注释去掉,不要留空格。

5 校准触摸屏

cd /opt/tslib-1.4/bin

./ts_calibrate

会出现校准画面,完成后生成pointercal 文件

6 链接

ln -s /opt/tslib/etc/pointercal /etc/pointercal

7 修改配置文件

tslib的配置文件是/opt/tslib-1.4/etc/ts.conf,针对不同的触摸屏可能需要设置不同的配置参数。目前AlWhales联鲸微工业电脑(电容屏)使用的配置如下所示:

# Uncomment if you wish to use the linux input layer event interface
module_raw input

# Uncomment if you're using a Sharp Zaurus SL-5500/SL-5000d
# module_raw collie

# Uncomment if you're using a Sharp Zaurus SL-C700/C750/C760/C860
# module_raw corgi

# Uncomment if you're using a device with a UCB1200/1300/1400 TS interface
# module_raw ucb1x00

# Uncomment if you're using an HP iPaq h3600 or similar
# module_raw h3600

# Uncomment if you're using a Hitachi Webpad
# module_raw mk712

# Uncomment if you're using an IBM Arctic II
# module_raw arctic2

module pthres pmin=1
# module variance delta=30
module dejitter delta=100
module linear

3. qt4.8.6的交叉编译

  • 创建工作目录

$ mkdir /home/alwhales/CrossCompileDev/qt-4.8.6 –p

  • 解压qt-everywhere-opensource-src-4.8.6.tar.gz到该目录下

$ tar -zxvf qt-everywhere-opensource-src-4.8.6.tar.gz -C /home/alwhales/CrossCompileDev/qt-4.8.6

  • 拷贝builearm.sh到该目录下,vi编辑器下进行查看并修改QT_INSTALL_DIRTSLIB_DIR的目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GESsIk4f-1626352525524)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/50b81cd6-bdef-4ea7-bf6b-aa009a281bd0/Untitled.png)]

  • 修改完之后,就可以执行builearm脚本了
./builearm.sh

编译时间会很长,等他编译完之后会执行make install,这里可能会报权限错误,

如果报权限错误,就单独在命令行执行sudo make install命令就好了,等安装完成之后,会在qt库的存放路径下出现可移植的qt库了。如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b7BpjMjz-1626352525524)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2bf101e7-3f7a-4a01-b5ce-778f79f88e97/image7.png)]

移植qt库到开发板上:

1 将/usr/local/Trolltech/QtEmbedded-4.8.6-arm下的文件拷贝到开发板的/opt/qt-4.8.6/下,

2 编写qt.sh,此脚本在/etc/profile.d/目录下,内容如下图所示,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MmypVzT0-1626352525526)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1d0343f0-872d-4325-b1e8-540c7e88f0c6/image8.png)]

需要说明的是在开发板中运行qt应用程序的时候要加后缀 –qws

4. 配置qtcreator的交叉编译工具链

sudo apt-get install qtcreator

打开安装好的qtcreator(可以在ubuntu软件中心下载),点击工具栏的“工具”->“选项”,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iix6Amp4-1626352525526)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a97efcf9-abaf-463c-9e28-a0490cdbfd79/image9.png)]

点击“Qt Versions”按钮,点击此界面的“添加”按钮,在跳出来的对话框中选择编译qt4.8.6时产生的qmake文件,本文的qmake路径为/usr/local/Trolltech/QtEmbedded-4.8.6-arm/bin/qmake,视自身设置而定,配置如下图所示,设置完后点击“Apply”按钮,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-29eJc65v-1626352525527)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/78b51946-c5ae-41a8-b366-cb1ed272791b/image10.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d4xIDhLU-1626352525527)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7b898936-dc61-4d25-821f-7b3967617366/image11.png)]

点击“编译器”按钮,单击“添加”按钮,选择交叉编译器的g++路径,本文的路径为/opt/arm-gcc/4.9.1/bin/arm-linux-g++,配置如下图所示,配置完成后点击“Apply“按钮,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cxkkv195-1626352525527)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1a23427b-d200-4ed5-8218-359c3429e856/image12.png)]

点击“构建套件”,单击“添加”按钮,之后在“编译器”栏和“Qt版本”栏选择刚才添加的就好了,配置如下图所示,配置完成后点击“Apply”,然后点击“OK”按钮即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d9PP85Mv-1626352525527)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c8abac6d-cbdc-4dc5-99ab-b9f9658d14bd/image13.png)]

点击菜单栏上的 Tools Options 进入 Options 窗口,点击左侧 Build & Run ,在右侧出现的窗口中点击 Qt Versions ,设置 Qt 的版本。点击右边的 Add… ,在弹出的窗口中进入到 /opt/qt-4.8.5-sdk/bin ()中,选中qmake ,

然后点击 Open ,如图 6-11 所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KSAlFDDl-1626352525528)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d9529049-a149-4bad-a09e-babd53e6d6b6/image14.png)]

图 6-11

然后点击 Apply 。

在 Build & Run 中点击 Compilers ,配置我们所使用的交叉编译器,然后添加交叉编译工具,点击右侧的 Add 在出现的选项中选择 GCC ,点击下面 Compiler path: 右侧的 Browse… 按钮,选中 arm-linux-gnueavihf-gcc ,然后点击 Open 。输入 Name ,例如 arm-linux-gnueabihf-GCC ,然后点击 Apply。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U7MggqEV-1626352525528)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2d1acb93-5e4c-4d36-88d8-4bc190488274/image15.png)]

图 6-13

在 Build & Run 中点击 Debuggers ,配置我们所使用的调试器,点击右侧的 Add ,点击下面 Path: 右侧的 Browse… 按钮,选中 arm-linux-gnueavihf-gdb ,然后点击 Open 。输入 Name ,例如: arm-linux-gnueabihf-gdb Debugger ,然后点击 Apply 。如图 6-21 所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fr0kljpP-1626352525529)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2fac508a-59a3-4d78-b057-f8714eecebf1/image16.png)]

点击左侧 Devices,设置设备参数。点击右侧的 Add ,选中 Generic Linux Device ,

然后点击 Start Wizard ,输入名字,输入设备的 IP 地址,根据设备的实际地址设置,

输入设备的登录名:root ,然后点击 Next 。点击 Finish 完成设备的创建,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FUUcj7N8-1626352525529)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1e55ce5e-0166-4d9a-82c2-25163ab1c725/image17.png)]

5. 使用QT creator开发项目

创建新的项目,Kits选择上面的imx6设备。(注:只能选择一个设备,多选会出错)。

项目编译完成后,点击右侧的Project,点击左侧的 Projects ,选择 Build & Run ,在 imx6 中选择 Build ,在 Build Settings General 中,不要勾选 Shadow build: ,选择 Run ,点击 Method: 右边的 Add ,然后选择 Deploy to Remote Linux Host ,

添加完成之后你还可以在下方看到红色字体的 Remote path not set 错误,这个错误的解决方法是:点击左边的 Edit 并打开 *.pro ,添加以下两行信息:

target.path += /home/root

INSTALLS += target

然后选择 File Save 保存文件,添加之后点击左侧的 Project ,你可以看到红色字体已经消失,被 /home/root/hellomyir 取代。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tsKGOF9e-1626352525529)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4d45191b-970b-4f48-953c-bdab063aa388/image18.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yao1H8x0-1626352525530)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5bff3da4-cb1b-4702-8b4e-cacb260cfa9e/image19.png)]

注:在Arguments 选项后加上:-qws,否则会出错

6. 移植qt库到开发板上

1 将/usr/local/Trolltech/QtEmbedded-4.8.6-arm下的文件拷贝到开发板的/opt/qt-4.8.6/下,

2 编写qt.sh,此脚本在/etc/profile.d/目录下,内容如下图所示,

#!/bin/sh
export QTDIR=/opt/qt-4.8.6
export QWS_MOUSE_PROTO=tslib:/dev/input/event1
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib
export QT_QPA_FONTDIR= $QTDIR /lib/fonts
export QT_PLUGIN_PATH= $QTDIR /plugins

#export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
#export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1
#export LD_LIBRARY_PATH=$LIBRARY_PAH:$QT_LIB

说明:在交叉编译执行之后会在开发板上生成可执行文件,执行时后面加-qws

./hello -qws

7. 其他

安装Qt帮助文档

将qt-everywhere-opensource-src-4.8.6源码中./doc/qch文件夹复制到qt安装目录QtEmbedded-4.8.6-arm下。打开Qt Creator,依次点击Tools,Options,Help,Documentation,点击add,添加QtEmbedded-4.8.6-arm/qch中的文件。

Qt Creator的配置文件

如果出现Qt Creator程序的配置更改不能生效的问题,可能是因为它的配置文件出现了权限问题。Qt Creator的配置文件在/home/tao/.config/QtProject目录下。若删除这个目录下的文件,则Qt Creator会被重置,编译器配置、主题风格、快捷键设置等会全部恢复默认值。若更改这个目录下文件的权限,一般可以解决Qt Creator程序的配置不能生效的问题。同时,如果备份这个文件夹下面的文件,并在再次重装Qt Creator程序时恢复它,可以使程序直接恢复到备份文件所记录的配置状态。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w9mL1tXU-1626352525530)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/617336ff-2ebb-4d11-8f30-a1a22c260f36/image20.png)]

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 22:04:53  更:2021-07-16 22:05:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 4:16:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码