zoukankan      html  css  js  c++  java
  • 嵌入式成长轨迹34 【嵌入式学习阶段】【ARM环境调试】【QT 移植环境及简单程序示例】补充《ok6410 Qt移植百科全书》

    更新版

    http://www.cnblogs.com/zeedmood/archive/2012/12/08/2808393.html

    书上提及的有这些,分别说明下,里边打*可以不弄:
      Tslib1.4的编译 用于编译触控模块。自己的虚拟机上需要有这个。但如果板子文件系统/usr/local里边已经有tslib了,那可以不用再移动进去——这里编译的tslib是给Qtopia4.4.3用的,如果换成4.4.3打开不了触控的话,也可先用2.2.0系统打开,过了触控调试之后再换回4.4.3.或者使用飞凌自带的校准脚本,使用方法在里边有提及
      Qtopia4.4.3、*Qtopia2.2.0的编译 用于板子内系统界面。弄了Qtopia4.4.3的话,Qtopia2.2.0就可以不用了,但是前者一定要,到后期编译还得用上。
      Qt/E4.7的编译 这个还是要在虚拟机上布置,编译时间也会比较长,大概2、3小时

    那本《ok6410 Qt移植百科全书》确实没提及的问题比较多,接下来我给补充下:

    【问题如下】

    配置安装参数
    root@ubuntu:~/Desktop/tslib/tslib# ./configure --host=arm-linux        --cache-file=arm-linux.cache                                           --enable-inputapi=no                                                   PLUGIN_DIR=/usr/local/arm/tslib/plugins                                -prefix=/usr/local/arm/tslib/build                                     -host=arm-linux                                                        --cache-file=arm-linux.cache 2>&1 | tee conf_log

    configure: WARNING: unrecognized options: --enable-inputapi
    configure: WARNING: if you wanted to set the --build type, don't use --host.
        If a cross compiler is detected then cross compile mode will be used
    configure: loading cache arm-linux.cache
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    ……
    configure: WARNING: unrecognized options: --enable-inputapi

    将 --enable-inputapi=no 改为 --enable-input=no 错误消除,但不知对不对


    make[1]: g++: Command not found
    make[1]: *** [project.o] Error 127
    configure exited with value 2 at /witech/qt-extended-4.4.3/src/build/bin/configure line 5215
     main::bootstrap_qt() called at /witech/qt-extended-4.4.3/src/build/bin/configure line 1784
    make: *** [src/build/mkconf/configure] Error 2
    ./build: line 53: bin/qbuild: No such file or directory
    ./build: line 54: bin/qbuild: No such file or directory
    解决:
    安装g++

    在编译qt-extended-4.4.3的config阶段,出现以下错误后退出:
    Checking the compiler (host): OK (GCC 4, Little Endian)
    Checking the compiler (target): FAIL
    Note: Run configure -verbose for verbose errors
    make: *** [src/build/mkconf/configure] Error 1

    解决方法:
    这表明你的编译器安装的路径不对!
    用arm-linux-gcc -v查看正确的交叉编译器安装路径,输出的文本中有一项是:
    --prefix=/usr/local/arm/4.1.2
    表示,你的交叉编译正确的安装路径是/usr/local/arm/4.1.2
    你应该把/usr/local/arm/4.1.2/bin加入到PATH环境变量中去!

    修改环境变量,把交叉编译器的路径加入到PATH。 
     (虚拟机/主机)方法一:
      修改/etc/bash.bashrc文件 #vim /etc/bash.bashrc             在最后加上:
      export PATH=$PATH:/usr/local/arm/3.4.1/bin (注意修改版本、、、)
      export PATH    
     (开发板)方法二:
      修改/etc/profile文件:        
      # vim /etc/profile 增加路径设置,在末尾添加如下,保存/etc/profile文件:  
      export PATH=$PATH:/usr/local/arm/3.4.1/bin   
     方法三:
      #export PATH=$PATH:/usr/local/arm/3.4.1/bin          
      注:(这只能在当前的终端下才是有效的!)
    立即使新的环境变量生效,不用重启电脑:  
     对应方法一:#source /root/.bashrc  
     对应方法二:# source /etc/profile
    检查是否将路径加入到PATH:   
     # echo $PATH   
     显示的内容中有/usr/local/arm/bin,说明已经将交叉编译器的路径加入PATH。
    测试交叉编译命令和工具版本
            # arm-linux-gcc -v
    至此,交叉编译环境安装完成。

    bash: export: `PATH=/usr/local/arm/4.3.2/bin:……': not a valid identifier
    解决BASH SHELL脚本报错 ‘: not a valid identifier
    当在shell编辑脚本时,运行时出现了" ‘: not a valid identifier ",或者会出现(: command not found,许多莫名其妙的符号)很可能你在windows下编辑,在Linux下运行,由于Linux和windows的文本格式不同所导致的。上面可能是反应之一,有时终端显示" :没有文件…"也是这个原因造成的 大部分由分号开头":"
    解决方法:只要用UltraEdit工具转换成Linux格式,重新source运行无错误即可;或者还是老老实实在linux下打一遍吧、、

    当在windows下的多用户(例如在一个用户里安装程序,而在另一个用户里使用),或虚拟机中的Linux下也出现过这样的情况,就是安装完Qt Creator后运行程序,出现No valid Qt version set 的问题

    解决方法:

    以下几个步骤:
    1、/etc/bash.bashrc后追加设置环境变量
     #qt
     export PATH=/opt/qt-4.7.1/bin:/opt/qt-4.7.1/lib:$PATH

    2、打开上方菜单Tools->options,左边选择build and run,之后在里边将qmake、gcc添加
    auto detected的就不用管了,要的话就添加
    Qt Versions
      Qt 4.7.1 (qt-4.7.1) /opt/qt-4.7.1/bin/qmake
    在QT creator版本中手动加入了编译好的ARM版本,此时提示没有工具链,左边显示为红色叹号

    Tool Chains
      GCC-arm /usr/local/arm/4.3.2/bin/arm-linux-gcc-4.3.2
      GCC /usr/bin/gcc-4.6
    同时在工具链中加入/usr/local/arm/4.3.2/bin/arm-linux-g++编译器路径后,提示没有安装qmlviewer,左边显示为黄色叹号。
    3、在主页面左边菜单栏project那里,开起来就在第一种build&run方式里边,将qt版本和工具链都选上(如果要在电脑上运行,就得用里边配搭的Qt4.8而不是用4.7.1)。如果无法选择,就跳到第二种,尝试manage选上各个版本和工具链使之激活,再回第一种就出现可以选择了(、、、不要问我为什么,我也是走投无路、、、也许关掉qt creator再重启也行)。选好之后退出,在主页面build,运气好此时就能成功了。
    4、还不能执行
    /code/Helloword/moc_dialog.cpp:16: error: #error "(The moc has changed too much.)"
    如果本来有一些生成的配置文件,用make clean甚至make distclean删除,再试。 


    Starting /witech/Helloword/Helloword...
    Failed to start program. Path or permissions wrong?
    /witech/Helloword/Helloword exited with code -1

    解决:将权限改为777,或者用make clean删除一些多余文件

    ***没有规则可以创建“XXX”需要的目标“XXX”问题的解决方案
    解决:
    make clean 再不行就用make distclean
    make clean 和make distclean的区别:make clean仅仅是清除之前编译的可执行文件及配置文件。而make distclean要清除所有生成的文件。make distclean类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile。
    上面的问题的根源是因为,经过拿来主义的代码里面已经有配置文件,是根据原来的编译环境生成的,仅仅通过make clean并不能清楚之前的配置文件,没有清除之前的配置文件就进行编译,编译器本着相信程序员的态度,编译时不会产生新的configure生成的附带文件,而是根据原来的configure生成的文件进行编译,这样就会导致上面的一系列编译错误。make distclean可以将所有的垃圾,之前环境所有的余孽清理干净,这样就不会给编译器偷懒的机会。

    QT编译问题:/usr/local/Trolltech/Qt-4.7.0/bin/uic:命令未找到
    解决:
        我在linux下安装了QT之后,将在windows下写的程序拷贝到linux下,然后运行qmake命令,没有问题,当运行make命令的时候,出现了编译错误,如下:
    /usr/local/Trolltech/Qt-4.7.0/bin/uic:命令未找到

           错误的大体意思就是没有找到那个需要使用的在指定文件夹下的可执行文件uic,我到我的/usr/local目录下没有找到Trolltech这个目录,因为我安装QT 的目录是qt-everywhere,于是为了使编译器能够找到它需要的那个命令,我将在/usr/local目录下建立一个软连接,直接指向编译器需要的目录。

    具体做法如下:首先在/usr/local目录下建立一个文件夹Trolltech,然后进入这个文件夹,再执行下面的这个命令,
    ln -s  /usr/local/qt-everywhere   Qt-4.7.0
    这样由Qt-4.7.0就可以找到bin目录下的uic可执行文件了。

    qmake后出现错误 qt_config.prf:10: include(file) requires one argument.
    解决:
    环境变量设置的问题,将QMAKESPEC修改下或删掉

    用qmake正常,之后再make的话,会有这样的错误信息
     from dialog.cpp:1:
     /witech/qt-extended-4.4.3/qtopiacore/qconfig-qpe.h:1:91: error: http://www.cnblogs.com/http://www.cnblogs.com/../qt- extended-4.4.3/qtopiacore/qt/src/corelib/global/qconfig-qpe.h: No such file or directory
     make: *** [dialog.o] 错误 1
    用Qt Creator(在tools->options中添加arm用qmake)的话,在最后也同样能得到这样的错误信息:
     /witech/qt-extended-4.4.3/qtopiacore/qconfig-qpe.h:1: error: http://www.cnblogs.com/http://www.cnblogs.com/../qt- extended-4.4.3/qtopiacore/qt/src/corelib/global/qconfig-qpe.h: No such file or directory
    不过这次从第一行能看到错误,似乎在 In file included from /witech/builddir/sdk/qtopiacore/qconfig-qpe.h:1,双击该错误直接跳到/witech/builddir/sdk/qtopiacore/qconfig-qpe.h:1:
     #include "/witech/qt-extended-4.4.3/qtopiacore/qconfig-qpe.h"
    这个路径是错误的,里边没有这个文件。
    于是在硬盘里找了很久之后,才发现真的没有、、、
    后来才突然想起来,会不会是之前的一个操作,把文件误删了呢?因为qt-extended-4.4.3和builddir当时都在,前者打开里边的东西后者好像都有,就顺手把前者给删了、、、估计因为这样、、才出事的
    手贱没办法,还是重新编译一个吧、、、三小时啊、、、


    因为误删所以重装、、、qt-extended-4.4.3,结果:
    http://www.cnblogs.com/../qt-extended-4.4.3/qbuild/src/main.cpp:49:33: warning: ignoring return value of 'int chdir(const char*)', declared with attribute warn_unused_result [-Wunused-result]
    make[1]: *** [main.o] Error 1
    make exited with value 2 at /witech/qt-extended-4.4.3/src/build/bin/configure line 2355
    make: *** [src/build/mkconf/configure] Error 1
    ./build: 行 53: bin/qbuild: 没有那个文件或目录
    ./build: 行 54: bin/qbuild: 没有那个文件或目录
    解决:
    “我用的是ubuntu11.04的,我安装了g++编译器后,再把qt creator卸掉,就可以了,另外,可以用g++ -v查看g++编译器是否已安装”

    之后还是不行、、、哎、、、只好直接重装系统了、、、(其实我后来怀疑应该先卸掉g++,再重装,不过已经没勇气再看到出现这个错误了)

    这周全部工作推翻重来,误删害人啊、、、

    ubuntu 如何卸载qt creator
    解决:
    假如你是通过软件中心或者apt安装的。可以在软件中心-》所有软件(点已安装会很慢的)里面找到,然后点击卸载。
    或者在命令行:sudo apt-get remover qtcreator

    假如你是从诺基亚或者论坛下载的qt的二进制安装包安装的。
    进入qt的安装目录默认是/opt/Qt...
    然后用管理员权限运行SDKManger,选择removed all compoent单选框,确定。即可。

    这个是百科全书里边有提及的,不过还是mark一下:
    qmake之后立即make;或者使用QtCreator进行构建,会发生错误
    moc_dialog.o:(.rodata+0x11c): undefined reference to `typeinfo for QDialog'
    collect2: ld returned 1 exit status
    make: *** [Helloword] Error 1
    解决:
    要修改下Makefile,在CFLAGS和CXXFLAGS中添加" -fno-rtti "编译参数,保存退出,之后编译就可以通过了。


    这个按照书上说的设置还是不行
    ./Helloword: error while loading shared libraries: libQtGui.so.4: cannot open sh
    ared object file: No such file or directory
    解决:
    其实libQtGui.so.4这个文件是有的,只是要设好环境变量。书上没有添加LD_LIBRARY_PATH
    然后不知道为何在里边用脚本却改不了环境变量,只有在/etc/profile里固化了、、、
    重新设置开发板的环境变量为(/etc/profile):
    #Qt
    export PATH='/opt/Qtopia4.4.3/lib:/opt/Qtopia4.4.3/bin:/sbin:/usr/sbin:/bin:/usr/bin'
    export QPEDIR='/opt/Qtopia4.4.3'
    export QTDIR='/opt/Qtopia4.4.3'
    export QT_QWS_FONTDIR='/opt/Qtopia4.4.3/lib/fonts'
    export QWS_DISPLAY='LinuxFb:mmWidth152:mmHeight88:1'
    export QWS_MOUSE_PROTO='Tslib:/dev/input/event1'
    export TSLIB_CALIBFILE='/etc/pointercal'
    export TSLIB_CONFFILE='/usr/local/tslib/etc/ts.conf'
    export TSLIB_CONSOLEDEVICE='none'
    export TSLIB_FBDEVICE='/dev/fb0'
    export TSLIB_PLUGINDIR='/usr/local/tslib/lib/ts'
    export TSLIB_ROOT='/usr/local/tslib'
    export TSLIB_TSDEVICE='/dev/input/event1'
    export TSLIB_TSEVENTTYPE='H3600'
    export QT_PLUGIN_PATH='/opt/Qtopia4.4.3/plugins:/opt/Qtopia4.4.3/qt_plugins/'
    export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:$QTDIR/qt_plugins/:/usr/local/lib:$LD_LIBRARY_PATH

    也谈Qt经典出错信息之QApplication: No such file or directory
    http://blog.csdn.net/qter_wd007/article/details/5377131
    这个问题似乎是老生常谈了,好多朋友也都就这个问题做了探究,这里我说说我的看法,以及对于初学者而言,如何快速定位问题,快速解决问题,

    下面是网友zhu的完整阐述:

    这个出错信息一般是新手在编译Qt4第一个应用”Hello,World”的时候,翻开Qt编程的第一个例子。都说很简单。
    #include <QApplication>
    #include <QWidget>
    int main(int argc, char *argv[])
    {
    QApplication app(argc,argv);
    QWidget *ww=new QWidget();
    ww->resize(300,200);
    ww->show();
    return app.exec();
    }
    一编译结果出现了上面这个错误,那叫一个郁闷。

    其实花点心思照着提示,新手也是可以自己解决问题的。根据提示QApplication提示,应该是头文件没找到。那我们可以查看当前目录下Makefile里的环境变量INCPATH知道make应用是去哪里找头文件的。例如
    ./Makefile 文件部分内容
    15 CXXFLAGS      = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)
    16 INCPATH       = -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I.
    17 LINK          = g++
    第16行里面的,对应的去查找/usr/include/qt4/QtGui/QApplication这个文件是否存在(一般是不存在,存在就不会出错了)。不存在QApplication文件的原因大致有两个
    1)没有装Qt4的开发包 .
    解决办法把开发包装上,比如ubuntu下就是在shell里执行sudo install libqt4-dev;Fedora/SUSe下是在shell里执行sudo yum install qt4-devel
    2) Qt4的开发包装了,但是调用了Qt3的qmake
    因为有的系统里既装了Qt3,又装了Qt4。如果调用了qt3的qmake,那么上头的INCPATH里的头文件路径也指向了Qt3,那么是找不到 QApplication这个文件的。对应的解决方法就是调用Qt4安装路径下的qmake去生成Makefile,最好用全路径。我的机器Qt4中 qmake安装路径是
    zhu@ubuntu:~/test/widget$ dpkg -L qt4-qmake |grep qmake |grep bin
    /usr/bin/qmake-qt4
    /usr/share/qt4/bin/qmake
    所以只要执行
    /usr/bin/qmake-qt4;make 或者 /usr/share/qt4/bin/qmake:make
    都能以Qt4的文件去编译这个最简单的Qt4应用。

    原文链接:http://www.cuteqt.com/blog/?p=307

    对于新学习Qt朋友而言,其实只要了解了这些内部缘由即可,这种情况一般就是环境变量没有设置正确的原因。

    一是根本就没有设置环境变量,比如使用SDK方式安装Qt,但却又不使用Qt Creator作为IDE(Qt Creator在运行时会自动为开发者设置好环境),而是使用其他的IDE或者是vim等来做开发,这样自然就会爆出这个错误。

    二是设置了环境变量却又没有设置正确。比如在X11下,设置好环境变量之后,需要重新登录shell,如果不这样做而直接开始开发,一般有可能会报出这个错误。

    三是系统中同时存在多个版本的Qt。比如有Qt3和Qt4共存,有多个不同版本Qt4存在,这样就需要考虑一是清理一下环境,使用一个“纯净”的Qt4环境;1是如果在Windows上,可以思考是否有必要同时存在这么多的版本,如果没有实在的必要,统一即可,当然这也是在打造一个“纯净”的Qt4环境;2是如果是在X11上,由于Qt3的存在有可能是系统的需要,系统中有好多的包是依赖Qt3的,那么要不每次在不同的Qt版本间切换时,就变更一下环境变量的设定,要么为各个Qt版本设定为不同的用户使用,每个用户都有唯一的环境了;要么就是使用脚本,做法是为每个qt版本写设置环境变量的脚本, 仅在需要的时候对当前shell设置环境,这种做法对于初学者而言有一定难度,但是效果还是比较好的。

    好了,这个问题我想大概总结的比较清楚了,供大家参考,如果还有更多的情况,也请补充,我们共同找到最佳的解决方案。

    Qt4.3.5-X11-交叉编译平台的搭建、移植详解
    http://linux.chinaunix.net/techdoc/develop/2009/04/26/1109010.shtml
     
    首先我们要知道的是Qt平台有Pc开发平台,(以本人所装的Redhat9linux/Qt4.3.5/arm-3.4.1版本为例)
    一、Qt嵌入式开发平台的建立
    概述:Qt嵌入式开发平台包括:
    1、Qt-X11开发平台:(即为我们平时开发Qt应用程序时使用的系统平台)。
    2、QtopiaCore-4.3.5开发平台(即framebuffer):该平台可以让Qt程序在pc机上模拟在嵌入式平台的运行情况,一般在QtopiaCore上模拟运行成功后才,进行交叉编译。
    3、QtopiaCore-4.3.5-arm交叉编译平台:在此平台下编译通过的Qt程序就可以移植到arm板上运行了。
    step1:
       建立Pc开发平台(x11、redhat9的桌面就属于X11):
       下载Qt4.3.5pc开发包qt-x11-opensource-src-4.3.5.tar.gz
       #tar xzvf qt-x11-opensource-src-4.3.5.tar.gz
       #cd Qt-4.3.5
       #./configure    //
       #make install   //此过程需要3-8小时
       安装好后,系统默认安装在/usr/local/Trolltech/Qt-4.3.5目录下
       检查环境变量:
       #which qmake  
        
    step2:
       建立QtopiaCore-4.3.5编译平台(此时编译器仍然用的是默认的gcc)
       此平台下的安装包原码包和X11平台是一样的,只是configure时配置不同
       #tar xzvf qt-x11-opensource-src-4.3.5.tar.gz
       #cd Qt-4.3.5
       #./configure -embedded x86 -qvbf -no-openssl  //注意几个选项表示,以qvfb表示    -no-openssl表示不需要认证,否则会安装过程中一直叫你输入yes确认
       #make install         //此过程需要3-8个小时
       安装完成后usr目录多了一个文件夹/usr/local/Trolltech/QtopiaCore-4.3.5就表示安装成功了
     
    step3:
       QtoptiaCore-4.3.5-arm交叉编译平台的建立(此时不是用系统默认的gcc来编译了)
       此平台下的安装源码包X11平台是一样的,只是configure时配置不同
       #tar xzvf qt-x11-opensource-src-4.3.5.tar.gz
       #cd Qt-4.3.5
       #./configure -embedded arm   //注意几个选项,必须加上 -embedded arm选项
       #make install         //此过程需要3-8个小时
       安装完成后usr目录多了一个文件夹/usr/local/Trolltech/QtopiaCore-4.3.5-arm就表示安装成功了
      
    step4:
       设置环境变量:环境变量的设法总的说来有4种(export、profile、.bashrc、.bashrc_profile)具体看自己情况来定
       #vi /root/.bash_profile  //在环境变量的最前面加上一句:PATH=/usr/local/Trolltech/QtopiaCore-4.3.5-arm/bin:$PATH
       #source /root/.bash-Profile   //使环境变量生效
      
       好了平台已经搭建好了,可以用他来编译Qt程序了
      
    step5:
       用QtopiaCore-4.3.5-arm来进行交叉编译
       #qmake -v  //检查自己的qt环境变量是否正确,如果不正确的话,就返回第4步
       #cd myqtprogram   //进入自己写的qt程序
       #qmake -project   //根QtX11环境一样编译
       #qmake
       #./myqtprogram    //运行程序
      
    step6:
       察看自己写的Qt程序需要用到哪些库文件资源。
       #arm-linux-readelf -a -myqtprogram | grep Shared  //Shared首字母大写;
      
    step7:
       拷贝库文件:
       根据上一步提示把Qt程序要用到的资源文件拷到自己制作的根文件系统中,以下是按本人写的Qt程序所需要的库写的
       将程序移植到arm板运行,根文件系统root.cramfs和kernel的制作在这里就不细说了,本人用的是自己早做好的qt-root文件系统。
       拷贝库文件到自己制作的root系统中(注意:拷贝时一定要看看大小,千万不要拷到连接文件(相当于快捷方式)了)
       #cd qt-root
       #cd usr/lib    //注意这里不要进到pc机linux的usr目录下去了
       #cp /usr/local/Trolltech/QtopiaCore-4.3.5-arm/lib/libpng*  ./                  //把图形库考过去,否则图片显示不了,强烈建议用png、bmp格式的图片,用其他格式的图片的话,否则你还要自己做连接库
       #cp /usr/local/Trolltech/QtopiaCore-4.3.5-arm/lib/libQtCore.so libQtGui.so  ./     //这2个库不用说一定要考的
       #cp /usr/local/Trolltech/QtopiaCore-4.3.5-arm/lib/libQtNetwork.so  ./           //和网络相关的库
       #cp /usr/local/Trolltech/QtopiaCore-4.3.5-arm/lib/libstdc++.so  ./
       #cd ../    //以下是在根文件系统qt-root/usr/local/下制增加一个Trolltech/QtopiaCore-4.3.5-arm/lib/fonts路径目录并添加相应的字体文件,否则在arm板上会出错显示不了字
       #mkdir local/Trolletch
       #mkdir local/Trolletch/Qtopia-4.3.5-arm
       #mkdir local/Trolletch/Qtopia-4.3.5-arm/lib
       #cp /usr/local/Trolltech/QtopiaCore-4.3.5-arm/lib/fonts local/Trolletch/Qtopia-4.3.5-arm/lib  //注意不要拷错路径了
    step8:
       把程序下载到arm板运行(注意:本人是用的microsoft的附件/通讯工具/超级终端连接到板子上,以下的操作对象都是在板子上了)
       #./ln -s /dev/fb/0 /dev/fb0  //由于本人的板子上烧的root文件系统显示设备名称和路径都不匹配,所以只有给他做个连接了,否则运行时会提示找不到fd0
       #./myqtprogram -qws   //-qws表示以服务器模式运行
       ok能在板子上跑起来了

  • 相关阅读:
    旋转数组的最小数字(JAVA)
    两个队列实现栈&两个栈实现队列(JAVA)
    重建二叉树(JAVA)
    二维数组的查找(JAVA)
    Java垃圾回收机制概述
    前端开发环境
    Java语法糖 : try-with-resources
    立个Flag (20180617-20181231)
    关于标签的整理
    Java反射机制
  • 原文地址:https://www.cnblogs.com/zeedmood/p/2638325.html
Copyright © 2011-2022 走看看