zoukankan      html  css  js  c++  java
  • 嵌入式成长轨迹62【智能家居项目】【ARM 飞凌ok6410】【QT&QWT&sqlite3安装配置】

    推荐阅读顺序:

    基本环境搭建:

        【配置】在虚拟机Ubuntu下NFS网络文件系统建立

       《ok6410 Qt移植百科全书》

       【配置】QT&QWT&sqlite3安装配置 这中间出现问题可查阅

       【调试】ARM QT 移植环境搭建问题---补充《ok6410 Qt移植百科全书》

    日常使用:

      【配置】将PC端QT代码修改为ARM端可用

      【配置】SD卡一键烧写

    这中间出现问题可查阅:

      【调试】智能家居代码移植时环境调试问题集锦

     

    Version 2012.12.7

     

    环境配置人员

    郑子木

     

     

    硬件环境

    QT版本为4.7.1,

    arm-linux-gcc版本4.2.2-eabi,

    飞凌OK6410开发板

    飞凌提供的3.0.1内核

     

     

    子环境A配置:编译移植tslib1.4

    配置步骤1 

    安装autoconf ,automake ,libtool三个工具

    配置步骤2 

    解压缩tslib1.4.tar.gz

     

    tar xzvf tslib1.4.tar.gz

    cd tslib

     

    配置步骤3 

     ./autogen.sh // 用于生成configure

     

    配置步骤4

    ./configure --prefix=/usr/local/tslib/ --host=arm-linux ac_cv_func_malloc_0_nonnull=yes

    配置步骤5

    make

    配置步骤6

    make install

    配置步骤7

    修改/usr/local/tslib/etc目录下的ts.conf文件,将module_raw input前面的注释和空格都去掉,注意空格必须去掉,不然出错

    //有需要可继续添加

    以上子环境A配置完毕

    注意事项

     

     

     

     

     

    子环境B配置:编译基本QT库

    配置步骤1 

    NOKIA官网上下载qt-everywhere-opensource-src-4.7.1.tar.gz

    将qt-everywhere-opensource-src-4.7.1.tar.gz压缩包解压

    tar xzvf qt-everywhere-opensource-src-4.7.1.tar.gz

    cd qt-everywhere-opensource-src-4.7.1

     

    配置步骤2

    配置QT(可以在这里对QT进行裁剪)

    解压qt-everywhere-opensource-src-4.7.1.tar.gz,并拷贝出三份,分别命名成qt-4.7.1-arm、qt-4.7.1-x86、qt-4.7.1-pc。

     

    1、配置x86版Qt 这个主要是用来搭建qvfb。Qvfb的作用是在x86上模拟arm架构(其实也可以只用pc版做模拟),并且可以用来制作字体库。但如果没有这些需求的话可以不编译。参考引用附件《使用qvfb进行测试和制作字体库》

    cd qt-4.7.1-x86 ./configure -prefix /usr/local/Trolltech/qt-4.7.1-x86 -opensource -confirm-license -embedded x86 -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb -make tools make make install

    2、配置pc版Qt。主要是用来做开发和初期调试。

    cd qt-4.7.1-pc ./configure -prefix /usr/local/Trolltech/qt-4.7.1-pc -opensource -confirm-license make make install

     

    3、配置arm版Qt。主要是用来做arm板上的Qt支持。 cd qt-4.7.1-arm

    ./configure -opensource -confirm-license -release -shared -embedded arm -xplatform qws/linux-arm-g++ -depths 4,8,16,18,24,32 -fast -optimized-qmake -qt-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -little-endian -host-little-endian -no-qt3support -no-libtiff -no-libmng -no-opengl -no-mmx -no-sse -no-sse2 -no-3dnow -no-openssl -no-webkit -no-qvfb -no-phonon -no-nis -no-cups -no-glib -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-separate-debug-info -nomake examples -nomake tools -nomake docs -qt-mouse-tslib -I /usr/local/tslib/include -L /usr/local/tslib/lib -D__ARM_ARCH_5TEJ__

     

    【备注】:

    进行编译配置;

    -opensource

    -confirm-license

    -release

    -shared

    -embedded arm

    -xplatform

    qws/linux-arm-g++

    -depths 4,8,16,18,24,32

    -fast

    -optimized-qmake

    加入以下插件

    -qt-sql-sqlite

    -qt-libjpeg

    -qt-zlib

    -qt-libpng

    -qt-freetype

    -little-endian

    -host-little-endian

    去掉以下插件

    -no-qt3support

    -no-libtiff

    -no-libmng

    -no-opengl

    -no-mmx

    -no-sse

    -no-sse2

    -no-3dnow

    -no-openssl

    -no-webkit

    -no-qvfb

    -no-phonon

    -no-nis

    -no-cups

    -no-glib

    -no-xcursor

    -no-xfixes

    -no-xrandr

    -no-xrender

    -no-separate-debug-info

    -nomake examples

    -nomake tools

    -nomake docs

    设置 tslib 为鼠标驱动、校正

    -qt-mouse-tslib

    -I/usr/local/tslib/include

    -L/usr/local/tslib/lib

    支持 arm 体系结构,6410:-D__ARM_ARCH_5TEJ__ 2440/10:-D__ARM_ARCH_4T__

    -D__ARM_ARCH_4T__

     

     

     

    配置步骤3

    修改源代码

    修改qt-everywhere-opensource-src-4.7.3/mkspecs/qws/linux-arm-g++/qmake.conf文件(添加lts参数,貌似是指tslib库):

    QMAKE_CC = arm-linux-gcc -lts

    QMAKE_CXX = arm-linux-g++ -lts

    QMAKE_LINK = arm-linux-g++ -lts

    QMAKE_LINK_SHLIB = arm-linux-g++ -lts

    修改qt-everywhere-opensource-src-4.7.3/src/3rdparty/freetype/include/freetype/config/ftconfig.h

    将"orr %0,%2, lsl #16/n/t" /* %0 |= %2 << 16 */

    修改为 "orr %0, %0, %2, lsl #16/n/t" /* %0 |= %2 << 16 */

    意思是加一个%0在%2前面。

     

    配置步骤4

    make

    配置步骤5

    make install

    配置步骤6

    准备中文字体,下载文泉驿字体库

    将文泉驿字体库拷贝到QtEmbedded-4.7.3-arm/lib/fonts;

     

    或者希望制作其它字体库:

    参考引用附件《使用qvfb进行测试和制作字体库》

    配置步骤 7

    自行在ubuntu中安装Qt creator.在其中配置好Qt库的路径(否则会出现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删除,再试。 

    //有需要可继续添加

    以上子环境B配置完毕

    注意事项

     

     

     

     

    子环境C配置:将库添加到开发板根文件系统

    配置步骤1  gcc在/lib下所需库

    飞凌在附带的文件系统中已给出。

     

    根文件系统/lib需要的库(具体与版本有关,你可以试一个QT程序看提示缺少什么)

    可从arm-linux-gcc安装目录下得到;

     

    配置步骤2 拷贝tslib、QT相关库到开发板根文件系统

    将安装的tslib目录拷贝到开发板根文件系统的/usr/local;

    将安装的QT目录QtEmbedded-4.7.3-arm拷贝到开发板根文件系统的/usr/local/Trolltech;

     

    配置步骤3

    创建QT配置文件

    根文件系统的/etc目录下创建一名为profile的文件,内容如下:

    export QTDIR=/usr/local/Trolltech/QtEmbedded-4.7.3-arm

    export T_ROOT=/usr/local/tslib

    export PATH=$QTDIR/bin:$PATH

    export TSLIB_CONSOLEDEVICE=none

    export TSLIB_FBDEVICE=/dev/fb0

    export TSLIB_TSDEVICE=/dev/event1//只要是1,触摸屏tslib测试程序就能正常工作,但在做完驱动课设后发现必须是0才可以,不知道为什么

    export TSLIB_PLUGINDIR=$T_ROOT/lib/ts

    export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf

    export TSLIB_CALIBFILE=/etc/pointercal

    export QWS_MOUSE_PROTO=tslib:/dev/event1//只要是1,自己写的HelloQt应用程序就能正常工作,如果替换内核的话,有可能会发生改变——变为event0、1、2等。

    export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib

    注意TSLIB_TSDEVICE、QWS_MOUSE_PROTO指定的设备与具体开发板内核相关,可能与上面不同;

     

     

    【备注】

    export setTSLIB_ROOT=/usr/local/tslib

    #tslib 库的目录

    export setTSLIB_CONSOLEDEVICE=none

    #tslib 运行需要的控制台,就是 LCD 屏幕 ,设定为 none

    export setTSLIB_TSDEVICE=/dev/event0

    #触摸屏设备文件

    export set TSLIB_FBDEVICE=/dev/fb0

    #LCD 显示器设备文件

    export setTSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf

    # tslib 库配置文件路径

    export set TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts

    # tslib 库插件的目录

    export set TSLIB_CALIBFILE=/etc/pointercal

    #触摸屏校正配置文件的路径

    export setQTDIR=/usr/local/Trolltech/QtEmbedded-4.5.3-arm

    #QT 库的路径

    export setQPEDIR=/usr/local/Trolltech/QtEmbedded-4.5.3-arm

    #对于 QT 4 Embedded 版本同上

    export set PATH=$QTDIR/bin:$PATH

    #加入到 PATH

    export setQWS_MOUSE_PROTO=tslib:/dev/event0

    #触摸屏设备文件

    export set QWS_DISPLAY=LinuxFb:/dev/fb0

    #LCD 显示设备文件

    export set QWS_SIZE=800x600

    #显示区域大小,可以不加

    export setLD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH

    #加入到 LD_LIBRARY_PATH

     

    配置步骤4 采用nfs方式挂载根文件系统;

    详见文档《【配置】在虚拟机Ubuntu下NFS网络文件系统建立 Version 2012.11.12》

    配置步骤5 ARM板触摸屏校准

    超级终端中输入:

    /usr/local/tslib/bin/ts_calibrate

     

    配置步骤6 自己编写程序,验证下

    1、生成Makefile

    在项目.pro同级文件目录下执行../qt-4.7.1/../qmake(按自己arm qt的安装路径来设置)

    2、编译

    qmake结束后,在Makefile相同文件目录下执行make

    3、检验

    通过file ./filename 来检验是否为ARM可执行文件。出现的信息中有ELF ARM字样即可,有x86则不可。

    4、拷贝到ARM板NFS文件系统的某个位置下

    5、执行程序

    ./filename -qws -font wenquanyi &

     

    //有需要可继续添加

    以上子环境C配置完毕

    注意事项 在ARM上执行Qt程序要加上-qws指令,如果有指定字体库还要加-font

     

     

     

    子环境D配置:QWT配置安装

    配置步骤1 

    解压qwt压缩包,进入目录qwt-5.2.1

     

    配置步骤2

    1、ARM版

    1)qmake(使用ARM版本qmake)

    2)打开目录下(有的在qwtconfig文件夹里)的qwtconfig.pri配置文件,屏蔽designer的编译。有这条语句:

      QWT_CONFIG     += QwtDesigner

    加“#”注释掉。然后再编译就通过了。

    另外,qwtconfig.pri文件中有以下一句:

      #QWT_CONFIG     += QwtExamples

    这就是说工程默认是不编译示例程序的,要编译的话,就去掉注释,OK,编译完后会在qwt-5.2.1/examples目录下生成bin目录,下面就都是示例程序。

    3)#make

    如果没有屏蔽designer的编译,这里编译将出现错误,是关于一些Designer的头文件找不到,因为qwt自定义了一些designer的插件,方便我们进行开发,所以需要一些Qt Designer的头文件,

     

    将qwt ARM版本的默认安装目录/usr/local/qwt-5.2.1/lib/下的4个库文件分别copy到arm文件系统的/usr/share/qt4/lib目录下和/usr/lib目录下

     

     

    PC版

    我们要编译出一个qwt的X86版本

    1、确保Qt库已经安装并配置完毕环境变量:

       export PATH=/usr/local/Trolltech/Qt-4.6.3/bin/:$PATH; 

    2、#qmake (使用x86版本的qmake工具)

    在已经安转有Qt开发环境,并且已经配置完毕的情况下,这步将顺利完成,如果出现错误,就请仔细检查Qt是否正确安转。

    3、执行命令:

    #make

    这个版本不必注释designer部分,直接编译就会通过。

    4、编译完成后,执行命令:

    #make install

    5、安装完毕后,就可以在/usr/local下看到安装好的qwt目录,执行最后一步,将库文件目录导入至环境变量:

    #vi /etc/profile

    打开后,在最后输入:

    export LD_LIBRARY_PATH=/usr/local/qwt-5.2.1/lib:$LD_LIBRARY_PATH

    6、在/qwt-5.2.1/designer/plugins/designer目录下会有两个编译好的库文件,如下图(可能只有一个):

     

     

     

    将这两个库文件copy到/qtsdk-2010.01/bin/designer目录下,如下图:

     

     

     

    ok,再打开qt creator看下:

     

     

     

     

    配置步骤3 配置需要编译的项目的.pro文件

    在使用qwt的工程文件中加入: INCLUDEPATH += /usr/local/qwt-5.2.1/include LIBS += -L"/usr/local/qwt-5.2.1/lib/" -lqwt

     

    配置步骤

     

    //有需要可继续添加

    以上子环境D配置完毕

    注意事项

     

     

     

    子环境E配置:Sqlite3配置安装

    配置步骤1 安装PC端Sqlite3

    1、解压文件tar -zxvf sqlite-amalgamation-3.7.3.tar.gz.

    2、解压后生成sqlite-3.7.3目录. cd 进入sqlite-3.7.3。

    3、./configure

    4、make

    5、make install

    配置步骤2 配置编译ARM端Sqlite3

    ubunturoot用户登录

    1、将sqlite-3.3.6拷贝到目录 /root 

    # cd

    2、解压sqlite-3.3.6 并到该目录下建立任意目录如 build

    #tar -zxvf sqlite-3.6.22.tar.gz

    #cd sqlite-3.6.22

    #mkdir build

    3、修改sqlite-3.3.6下的 configure

    # vi configure

    或者

    #gedit configure

    注释掉下列这些代码(以下重复两次的说明被修改文件中有两个都要改的相同字段)

    #if test "$cross_compiling" = "yes"; then # { { echo "$as_me:$LINENO:: error: unable to find a compiler for building build tools" >&5 #echo "$as_me: error: unable to find a compiler for building build tools" >&2;} # { (exit 1); exit 1; }; } #fi

    #else # test "$cross_compiling" = yes && # { { echo "$as_me:$LINENO:: error: cannot check for file existence when cross compiling" >&5 #echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} # { (exit 1); exit 1; }; }

     

    #else # test "$cross_compiling" = yes && # { { echo "$as_me:$LINENO:: error: cannot check for file existence when cross compiling" >&5 #echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} # { (exit 1); exit 1; }; }

    保存退出;

    4、到刚才你所创建的目录下,创建Makefile文件

    # cd build

    #../sqlite/configure --disable-tcl --host=arm-linux注:这里可能会出现错误,只要把configure的路径改为绝对路径就可以了

    这个时候你所创建的目录下应该有Makefilelibtool等四个文件

    5、修改刚刚生成的Makefile文件

    修改 BCC = arm-linux-gcc -g -O2 为 BCC = gcc -g -O2

    6、由于是移植到arm上,为了在应用程序中引用sqlite3中的API接口,我们需要创建静态库,所以再次需要修改Makefile

    修改内容如下:

    找到 sqlite3$(TEXE): $(TOP)/src/shell.c .libs/libsqlite3.la sqlite3.h 修改为 sqlite3$(TEXE): $(TOP)/src/shell.c .libs/libsqlite3.a sqlite3.h 找到 -o $@ $(TOP)/src/shell.c .libs/libsqlite3.la \ 修改为 -o $@ $(TOP)/src/shell.c .libs/libsqlite3.a \

    (注意:这次编译不会生成sqlite的可执行文件,因为只是为了得到sqlite3.a静态库,在build目录下找到隐藏目录.libs ,该目录下有sqlite3.a

    7、重复步骤6把修改的Makefile中的sqlite3.a再改为sqlite3.la

    8、执行makemake install命令,如下:

    # make # make install

    这时应该不会有错误了,可以在目录 /usr/local 下看到目录 lib bin include

    9、修改sqlite3可执行文件的执行权限

    #chmod 775 sqlite3

    10、将lib目录下的libsqlite3.solibsqlite3.so.0、 libsqlite3.so.0.8.6 下载到开发板的 lib目录下,将sqlite3下载到 bin 目录下;

    11、测试数据库:

    a、新建数据库 [rootL-ant]# sqlite3 test.db SQLite version 3.6.18 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table film (number,name); sqlite> insert into film values (1,'aaa'); sqlite> insert into film values (2,'bbb'); sqlite> select * from film; 1|aaa 2|bbb sqlite>.quit [rootL-ant]#

    b、测试程序

    //test_sqlite.c #include <stdlib.h> #include <stdio.h> #include <sqlite3.h> staticintcallback(void *NotUsed, int argc, char **argv, char **azColName) { inti; for(i=0; i<argc;i++) { printf("%s = %s\n", azColName[i], argv [i]); } printf("\n"); return0; } intmain(int argc, char **argv) { sqlite3 *db; char*zErrMsg = 0; intrc; if( argc!=3 ) { fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]); } rc = sqlite3_open(argv[1], &db); if( rc ) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); } rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg); if( rc!=SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); } sqlite3_close(db); return0; }

    使用如下命令编译测试程序:

    arm-linux-gcc test.c -L.libs -I /root/sqlite-3.3.6/build -lsqlite3 -static

    解释-L指向静态库sqlite3.a所在目录,-I指向sqlite3.h 所在目录

    c、在超级终端下测试

    [rootL-ant]#./test_sqlite test.db "select * from film" number = 1 name = aaa number = 2 name = bbb [rootL-ant]#

     

    配置步骤 

     

    //有需要可继续添加

    以上子环境E配置完毕

    注意事项 如果测试出现问题:

    最近有需要用到sqlite,去官网下了一个编译安装后打开sqlite3出现SQLite header and source version mismatch这个错误。

    百度了一下,http://stackoverflow.com/questions/6696861/how-do-i-upgrade-my-sqlite3-package-on-debian-lenny 这个解决方案。但是尝试了一问题依旧。

    其实sqlite默认安装到了/usr/local/lib中,但是系统旧的sqlite库在/usr/lib/i386-linux-gnu里,而这个目录被搜索的优先级目测应该高于/usr/local/lib。我把旧的libsqlite3.so.0, libsqlite3.so.0.8.6删除就能打开sqlite3了。

    ——光是删掉还不行,应在将两个文件从/usr/local/lib取出覆盖之

     

     

    //有需要可继续添加子环境

     

     

     

    附件目录

    附件一

    QT 移植环境搭建问题---补充《ok6410 Qt移植百科全书》

    附件二

    ok6410 Qt移植百科全书

    以上以外部文件方式给出

    附件三

    使用qvfb进行测试和制作字体库

       
       

     

    附件3

    题目:使用qvfb进行测试和制作字体库

    来源:构建QT4.7.1嵌入式开发环境

    正文内容:

    测试安装情况 把usr/local/Trolltech/qt-4.7.1-x86/examples/widgits/calculator文件夹复制到root/tmp文件夹下 启动QtCreatorFile-->Open File or Project...,打开root/tmp/calculator/calculator.pro 这里我们分两部分,首先编译x86下的,并运行在qvfb下,再编译arm下的,最后移到开发板下运行。 x86下的编译与调试 1.QtCreator界面左侧点击Projects图标,打开工程设置界面。 2.Edit Project Settings for Project calculator-->Build Settings-->Edit Build Configuration;单击Add,在下拉列表中选择Using Qt Version x86弹出对话框单击Ok按钮,在Edit Build Configuration:下会出现蓝色的Make x86 Release active.字符,单击激活x86 Release 3.Run Settings-->Edit run configuration;右侧单击Show Details按钮,在打开的下拉列表中Arguments;文本框中添加参数-qws 4.设置完毕,点击Edit图标,回到编辑界面。 5.编译:在Build菜单下,先Clean Project calculator,然后Build Project calculator,在右下角Compile Output窗口能看到编译信息 6.运行: 启动终端,输入/usr/local/Trolltech/qt-4.7.1-x86/bin/qvfb -width 800 -height 480 &,启动qvfb 回到QtCreatorBuild-->Run,运行程序,切换我们的qvfb窗口中,就可以看到calculator的运行界面了 制作适合嵌入式系统的字库文件 1、拷贝Windows/Fonts/simhei.ttf/usr/local/Trolltech/qt-4.7.1-x86/lib/fonts 2、在一个终端中运行 /usr/local/Trolltech/qt-4.7.1-x86/bin/qvfb -width 800 -height 480 &,启动qvfp 3cd usr/local/Trolltech/qt-4.7.1/bin,在另外一个终端中运行 ./makeqpf -qws,就可以看见MakeQPF界面 4、在Famiy中选择SimHei(刚刚拷贝过来的),Pixel Size中选择要生成的字体的大小20等;在OutPut Options中选择生成文件的目录,待会去那找生成出的文件 5、点击Generate Pre-Rendered Font...,待会就会显示生成成功,会生成出一个simhei_20_50.qpf2文件 6、移除之前拷贝过来的simhei.ttf,要不然看不到效果(我现在也不知道为什么) 7、关掉MakeQPF,重新运行./makeqpf -qws -font simhei,这次显示的界面就和上次不一样了,字体大小明显发生了变化 8、你也可以试试其他的文件cd /usr/local/Trolltech/qt-4.7.1-x86/examples/widgets/calendarwidget,运行./calendarwidget -qws -font simhei 和运行 ./calendarwidget -qws的默认字体,比较一下看看 9Enjoy it! You have Done!

     

     

     

     

     

     

     

     

    附件2

    题目:

    来源:

    正文内容:

     

     

  • 相关阅读:
    小学生需要不断练习的四则运算题,在编程者的手上竟然会变成。。。
    在学习紧张的时候不如放松下来听听歌曲练练单词
    3.基础语法(变量,字符转义和注释)
    .NET基础
    初学.NET
    第七次实验作业
    自我介绍
    第七次实验总结
    第二次实验总结
    实验作业总结
  • 原文地址:https://www.cnblogs.com/zeedmood/p/2808385.html
Copyright © 2011-2022 走看看