码迷,mamicode.com
首页 > 系统相关 > 详细

64位双系统Ubuntu 14.04 LTS + Caffe + CUDA 7.5 + Opencv 3.0 安装配置实战

时间:2017-05-06 14:23:22      阅读:1016      评论:0      收藏:0      [点我收藏+]

标签:tom   方案   技术分享   成功   term   terminal   计算   依次   logs   

一切的一切,开端便是这caffe,作为博客的第一篇文章,自然要讲讲一个哲学问题“我是从哪来的”

一、windows情况下安装双系统64位Ubuntu

本段落根据http://www.linuxidc.com/Linux/2014-04/100369p2.htm而成。

下面开始:

1)首先还是分区,在计算机上右键--管理--磁盘管理

装Ubuntu分配的硬盘大小最好是(20G以上)不要太小,配好整个环境就要消耗10G左右,再加上数据集和各种库,空间太小非常尴尬。这里请注意,Ubuntu和Windows文件系统完全不同,所以我们划好要给Ubuntu的分区后,删除卷。到时候,安装好的ubuntu的分区,在Windows下是看不到的,但是进入Ubuntu是可以访问Windows的磁盘的。

2)准备两个东西EasyBCD软件,百度官网有下,个人版免费

还需要准备好Ubuntu 14.04 的ISO镜像

3)下面打开EasyBCD软件,可以看到现在我们的计算机只有一个启动“入口”,我们来给他加一个,第一步选择添加新条目(添加移动入口点),

 技术分享

第2步选NeoGrub,第3步点安装点保存 ,接着是配置(第4步),

 技术分享

然后就会出现一个menu.lst文件

技术分享

我们要编辑这个文件 因为系统就是这个文件找到我们的Ubuntu的。

把下面的英文复制进去,把原来的全覆盖掉

title Install Ubuntu
root (hd0,0)
kernel (hd0,0)/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.3-desktop-amd64.iso ro quiet splash locale=zh_CN.UTF-8
initrd (hd0,0)/initrd.lz

特别注意:

ubuntu-14.04.3-desktop-amd64.iso是iso的名字,考虑实际情况再行修改。

对于有的电脑上你的第一个盘符并不是C盘,在磁盘管理中可以看出,所以安装时需将(hd0,0)改为(hd0,1)【假设为第二个】。

注意:

(hd[n-1],[m-1]):表示的是第n块磁盘的第m个分区。通常MBR主引导的磁盘上允许最多4个主分区存在,所以一般来说【0=<m-1<4】表示主分区,而【4=<m-1】则表示逻辑分区。下图取自DiskGenius。

技术分享

关闭保存。

 

下面把准备好的Ubuntu镜像文件用压缩软件或者虚拟光驱打开,找到casper文件夹,把里面的initrd.lz和vmlinuz.efi解压到C盘,把.disk文件夹也解压到C盘,然后在把整个iso文件复制到C盘。

技术分享

重启 你就会看到有2个 启动菜单给你选择,我们选择 NeoGrub 引导加载器 这个选项。

技术分享

然后稍等待一段时间 就会见到我们想要安装的 Ubuntu了。

 技术分享

跟以前版本不一样的地方会出现一个键盘快捷键视图,就不再截图了。

默认 桌面有2个文档 一个是示例,我们选择 开始安装Ubuntu 14.04 LTS

记得在这之前 要按Ctrl+Alt+T 打开终端,输入代码:sudo umount -l /isodevice这一命令取消掉对光盘所在驱动器的挂载(注意,这里的-lL的小写,-l 与 /isodevice 有一个空格),否则分区界面找不到分区。

 技术分享

下面就点击 安装Ubuntu 14.04开始安装,选语言不用说,

 技术分享

技术分享

技术分享

没插网线或者网络不通反正没有无线的时候不会有上面这一步。

技术分享

选安装类型,装双系统我们用其他选项。

技术分享

接下来进入磁盘"分区"情况。这里安装 Ubuntu 的分区是上面我们腾出来的未定义分区(显示"空闲"状态)。上面"分区"加了引号,因为在 Linux 系统中,并没有硬盘分区这个概念,Linux 中取而代之的是文件概念,这个和 Windows 是有本质区别的。

技术分享

注意:
挂载点

在 Linux 系统里面,"分区"被称作"挂载点",简单明了的说,"挂载点"意思就是:

把一部分硬盘容量,"分"成一个文件夹的形式,用来干其他事情。这个文件夹的名字,就叫做:"挂载点"。所以,和Windows有着本质上的区别,你在任何 Linux 发行版系统里面,绝对不会看到C盘,D盘,E盘这样的,你能看到的,只有"文件夹"形式存在的"挂载点"。Linux 以目录的方式来组织和管理系统中的所有文件。

在Linux 系统里面,有一些已经定义好,用来干特定事情的挂载点,常见的"挂载点"有:

    /boot:用于存储系统引导文件,也是 vmlinuz 核心的所在。

    / :就一个符号,表示根目录的意思。也是系统管理员root的目录。

    /home:系统使用者的目录。用来存储用户程序、文件、文档等资源。

    SWAP:严格来说,swap不是挂载点。它是一种虚拟内存交换分区,当你机子的物理内存用完之后,会动用这部分 swap 分区来当作虚拟内存使用。当然 swap 是硬盘上的空间,即使是 SSD,速度也不及物理内存快。如果希望快速度的话,不能寄厚望于 swap,最好是加大物理内存,swap 只是临时解决方法。物理内存在4G或以上的机子,可以不需要 swap 分区。但是如果你的 Linux 是用来做开发,需要一些诸如 oracle 这样的软件数据库,swap 还是必须保留的。

Linux 磁盘命名

磁盘设备在 Linux 环境下,均以文件夹命名,挂载在 /dev 设备目录下。

    IDE 接口的硬盘,显示为:HD

    SATA 或 SCSI 硬盘,显示为:SD。多个硬盘为:sda,sdb,sdc。

    光驱,显示为:CDROM。多个光驱按数字排列:CDROM0,CDROM1,CDROM2。

    硬盘分区,如第一块硬盘的第一个和第二个分区,分别显示为:sda1,sda2。

常见挂载点设置

    SWAP:上面说过,物理内存在4G或以上的机子,可以不需要 swap 分区。但是如果你的 Linux 是用来做开发,需要一些诸如 oracle 这样的软件数据库,swap 还是必须保留的,给 1~2GB 足够了。

    / :如果是个人用,新手没必要分那么多分区,全部分一个根目录就行了。

    /boot:不一定要分出来。看你把 Linux 的引导安装在那个设备。

如果是默认安装启动引导器的设备不更改(即/sda),则是用 GRUB 2 来引导系统的,每次开机均会先进入 Grub 2 引导界面供你选择 Ubuntu 或者 Windows,选择后者的话才进入 Windows 的 NT6.x 引导界面,因为装在 sda 里会改写 mbr 引导信息。这种情况是不需要单独分 /boot 出来的。

如果把 /boot 分了出来,建议大小为 100M~300M。安装启动引导器可以选择 / 或者 /boot 分区,但是这样一来,装完之后只能看见 Windows 的引导菜单,也只能启动 Windows,需要进入 Windows 中使用 EasyBCD 或者 Grub4DOS 等软件来添加 Ubuntu 启动项。

双击显示空闲的设备,弹出"创建分区"对话框,依次填写大小,选择分区类型,分区位置,以及文件系统和挂载点。分区挂载点顺序可以调换,但当有一个设为主分区后其后面的也会跟着默认为主分区,而逻辑分区则不会。建议全部设置为逻辑分区。

说了这么多,推荐分区的方案如下(以30G为例):——yy

    / 15G ext4(根分区可以大点,python库和cuda都在这)

    SWAP 2G

    /home 13G ext4(剩下的给/home,home要也适当大一点——yy)

技术分享

设置好后,回到安装类型窗口,检查一下各分区和启动引导器的安装设备情况。

技术分享

如无错误,点"现在安装"。如果没有分 swap 分区,会有一个提示如下图,点"继续"就好了。

技术分享

有的说自动联网的,最好拔下网线,安装过程中会下载语言包等文件,会要一些时间,认为可以安装好后再下载,有空的就联网安装吧。这里选择不联网安装。 

 

部分安装图:

技术分享

这里插着网线的时候按继续会停止响应,拔下网线可解决。——yy

技术分享

下面的安装选择默认吧,不要改动什么(对菜鸟来说)。 

 技术分享

点击 现在重启 即可。

 

如果没有按本教程做的,看看下面的一些情况,可能对你有帮助。

注意:

(1)在选择安装启动引导器的设备时,可以选择我们分好的 / 区,也可以新建一个/boot区。

(2)若重启就会发现原来 Windows进不去了。

打开终端输入命令

sudo gedit /etc/default/grub

修改GRUB_TIMEOUT="10"
然后在终端中输入sudo update-grub
update 命令会自动找到 windows 7 启动项。并且自动更新 /boot/grub/grub.cfg 文件。这样重启就能进windows了。

(3)最后进入Windows 7,打开EasyBCD删除安装时改的menu.lst文件,按Remove即可。

然后去我们的c盘 删除vmlinuz,initrd.lz和系统的iso文件。

利用EasyBCD可以更改启动项菜单按Edit Boot Menu按钮,可以选择将Windows7设为默认开机选项。

  

后续——yy

提供一些可能会有帮助的网址:

【Caffe搭建:常见问题解决办法和ubuntu使用中遇到问题(持续更新)】

【error while loading shared libraries的解決方法】

【LINUX根目录下主要目录功能说明】

再推荐一些Linux上也能用得上的小程序:

Google Chrome

搜狗拼音

WPS office

 

二、Ubuntu入门

All by yy,以下想到哪写到哪。

到了Linux或者说Ubuntu,就要慢慢习惯使用命令行(cmd),命令行在Linux里称终端或者Terminal。Windows里拿鼠标点点点就能解决问题的情况一去不复返了。

1、先说文件结构。

上面在分区的时候已经提过,在Linux里没有分区的概念,取而代之成为了挂载点,换句话说不再有所谓的C盘D盘。

万物的源头叫做 /    ,这个东西也称为根目录。

进一步叫 /home  ,这个叫做主目录

再往下  /home/用户名/  ,从这里开始和“我的文档”有一定相似之处。

2、Terminal

直接Ctrl+Alt+T或者上搜索里搜终端出来的命令行一般是以  ~$  结尾。

换句话说,~$ 成为了用户输入命令的开头。

以 $ 为界,前面为路径,后面为命令。

这里有两个特殊情况 ~就是/home,~/就是home/

                   /就是/ 就是根目录。

换句话说,除了有 ~$ 还有 /$  表示命令的位置不同。

网上写的代码 $ 开头的命令只需要复制 $ 后面的命令就好,注意使用场合以及路径。

有的代码会专门写明 /$ 就是要去根目录下运行,也会有 ~$ 的现象

3、后续教程里没写的常用命令:

sudo  用超级用户身份执行,super user do,常用于各种“权限不足”“permission  balabala”

dir  显示当前目录下的文件列表,有变体可以上网查

cd空格+目录   就是打开目录

特例  cd  ~   直接跳到/home

      cd  /    直接跳到/

      cd  ..   返回上一层

4、其他

# 多用于注释

Ctrl+Alt+F1~F6会黑屏进入tty界面,tty也是终端,一样的。+F7回到图形化界面。

5、最后,注意目录问题,多百度多谷歌,祝你顺利。

 

三、Ubuntu 14.04 LTS + Caffe + CUDA 7.5 + Opencv 3.0

这部分主要参照http://blog.csdn.net/mduanfire/article/details/50939210

Caffe 安装

根据我们前面的情况说明,我们现在机器上没有GPU,按照官网的Caffe官网安装教程,我们先一步步地进行,之后安装完GPU(CUDA)后再重新编译即可,不用担心。

(1) 安装依赖库(一)

$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
$ sudo apt-get install --no-install-recommends libboost-all-dev

(2) 安装BLAS

也可以安装OpenBLAS或者MKL,以加速CPU性能(有GPU的童鞋可以忽略),这里我按照官网装了BLAS,有兴趣的童鞋可以自己研究另外两种,只需在最后编译caffe的时候修改一下配置文件即可。(这里我推荐OpenBLAS——yy文件夹里有,照着readme来做就好,或者官网说明)

$ sudo apt-get install libatlas-base-dev

(3) Python安装

Ubuntu 14.04 自带Python 2.7 ,无需自行安装。可以自测:$ python,进入python环境后会有版本提示;如果未出现请使用如下命令进行安装:

$ sudo apt-get install python

(4). Opencv3.0安装

安装方法详见: ubuntu14.04 LTS系统中Opencv 3.0开发环境的搭建 ,Opencv必须安装,且版本需要大于2.4。—[来自官网说明]

以下为网页内容摘抄外加个人状况——yy

 
安装基本编译环境
$ sudo apt-get install build-essential
安装相关依赖库
$ sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
下载OpenCV 3.0

下载使用 wget 工具,解压使用 unzip, 如果没有安装,请使用如下代码安装:

$ sudo apt-get install wget
$ sudo apt-get install unzip
$ mkdir ~/opencv # 新建opencv目录
$ cd opencv/ # 切换至opencv目录下
$ wget https://github.com/Itseez/opencv/archive/3.0.0-alpha.zip -O opencv-3.0.0-alpha.zip # 使用wget下载源码
$ unzip opencv-3.0.0-alpha.zip # 解压下载文件
安装OpenCV
$ cd ~/opencv/opencv-3.0.0-alpha # 切换至源码目录
$ cmake . # cmake+空格+”.”
$ sudo make
$ sudo make install
$ sudo /bin/bash -c echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf
$ sudo ldconfig

注:如果cmake过程中提示:ippicv_linux_20141027.tgz的hash码不对,则将下载的ippicv_linux_20141027.tgz手动复制到 opencv-3.0.0-beta/3rdparty/ippicv/downloads/linux-8b449a536a2157bcad08a2b9f266828b文件夹中,重新cmake即可

 

yy注:出现nvcc fatal   : Unsupported gpu architecture ‘compute_11‘错看这里

http://blog.csdn.net/sysuwuhongpeng/article/details/45485719

CUDA_GENERATION=还就真的是开普勒   GTX650是GK107核心

于是使用:

$ cmake -D CUDA_GENERATION=Kepler .  #注意这后面有个点

 

yy注:make过程超级慢。。。。。

 

yy注:error: a storage class is not allowed in an explicit specialization

参见http://www.cnblogs.com/platero/p/3993877.html

把 NCVPixelOperations.hpp放到

‘/home/yying/opencv/opencv-3.0.0-alpha/modules/cudalegacy/src/cuda/NCVPixelOperations.hpp‘

这里

这种问题多半是它报错的那个文件(右键gedit打开)那几行的static删掉就好了,后面还会错一次

 

yy注:make过程真的巨慢,而且很费空间,所以/home要大一点

编译samples程序
$ cd ~/opencv/opencv-3.0.0-alpha/samples     # 切换至例程目录
$ cmake .     # cmake+空格+”.”
$ sudo make -j $(nproc)    #(nproc)是进程数,根据计算机实际情况来定,一般电脑选4或8都可以
运行测试程序
$ cd ~/opencv/opencv-3.0.0-alpha/samples/cpp   # 切换目录, 使用alpha版本,images在samples/cpp文件夹下
$ ./cpp-example-facedetect lena.jpg

运行结果,如图所示: 

技术分享

至此opencv就装好了。

 

(5) 安装依赖库(二)

$ sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

(6) Caffe下载

使用Git进行下载,直接从github上下载最新版本,下载前切换至home目录。注:git的使用方法可参看:我的vim配置(.vimrc:git+github管理) ,这篇文章内容进行安装配置。clone后在home中便可以找到Caffe的下载目录了。

$ cd
$ git clone git://github.com/BVLC/caffe.git

(7) 编译Caffe前准备

<1>修改Makefile文件,最新版的Caffe已经帮我们修改好了,可以跳过;如果使用以前的版本则仍需要修改,这个可以自行Google。

<2>修改caffe/examples/cpp_classification/classification.cpp文件,加入:

#include <opencv2/imgproc/types_c.h>
#include <opencv2/objdetect/objdetect.hpp>

(8) 编译Caffe

$ cd ~/caffe
$ cp Makefile.config.example Makefile.config 
 
# 修改Makefile.config文件:如果没有GPU,则去掉CPU_ONLY:= 1的注释
# 如果安装了Opencv3.0,去掉 OPENCV_VERSION := 3的注释
 
$ make all 
# 到这一步可能会出现,缺少cublas_v2.h的错误提示,先不用管,这时以下两步也不需要执行了,这是由于未安装cuda造成的。
 
$ make test 
$ make runtest
yy注:make 的过程中会有很多问题
缺gflag时
$ sudo apt-get install libgflags-dev
缺glog时,进入文件夹目录
$ ./configure 
$ make 
$ make install
还要修改caffe makefile.config
带着波浪线的三行,修改完去掉#
# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := open~~~~~~~~~~~~~~~~~~~~
# Custom (MKL/ATLAS/OpenBLAS) include and lib directories.
# Leave commented to accept the defaults for your choice of BLAS
# (which should work)!
# BLAS_INCLUDE := /path/to/your/blas~~~~~~~~
# BLAS_LIB := /path/to/your/blas~~~~~~~~~~
以上两项的路径为/opt/OpenBLAS/xxx里

技术分享

 

Nvidia显卡驱动及Cuda 7.5 的安装

如果你的机器还没有装GPU,请直接忽略这一步和cuDNN安装

(1) 验证你的gpu支持是否支持Cuda

打开支持Cuda运算的Gpu列表,只要你的GPU在里面找得到就没问题。

(2) 查看当前使用显卡 
在终端输入以下命令,确认当前使用的是独立显卡,如果使用的是集显,则需要在开机时进入BIOS关闭集显。

$ lspci | grep -i nvidia

技术分享

(3) 确认你的系统是X86架构,可通过下面的命令查询

$ uname -m && cat /etc/*release   # 显示X86_64和系统信息即可  

 技术分享

(4) 安装gcc 
Ubuntu 14.04已经自带gcc 4.8.5,无需自行下载,检查gcc版本可通过如下方法:

$ gcc --version

 技术分享

如果发现还没安装gcc,可以执行:$ sudo apt-get install gcc-版本号

(5) 下载Cuda 
Cuda可以直接到Nvidia官网下载,下面官网的下载地址,有两种安装方式(.run 和 .deb),这里只介绍后者,因为比较简单易行。 这里选择下载信息如下图:

 技术分享

(6) 验证Cuda安装包(可跳过——yy)

$ md5sum 你的filename

如果下载没出错,那得到的MD5序列号和上图中是一致的,否则只能重新下载。

(7) 卸载旧版本Nvidia 
根据官网介绍,之前安装的版本都会有冲突的嫌疑。卸载命令:

$ sudo apt-get --purge remove nvidia*

(8) 安装Cuda 
cd切换至cuda安装包所在的目录,执行以下命令:

$ sudo dpkg -i cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda
安装CUDA 装完重启——yy

(9) 添加环境变量

$ sudo vim /etc/profile # 在末尾添加(注意自己的Cuda版本,vim可以用gedit代替):
 
export PATH=/usr/local/cuda-7.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
 
$ source /etc/profile
$ sudo reboot

(10) 安装例程 
例程本来在/usr/local/cuda-7.5/samples路径下,但不可写,使用如下命令进行复制:

$ cuda-install-samples-7.5.sh ~/cuda

(11) 查看GPU驱动版本、Cuda版本: 
正常安装的话,会出现版本信息,如果没出现说明安装出错,官网教程说的很清楚。

$ cat /proc/driver/nvidia/version
$ nvcc -V

 技术分享

 

(12) 编译例程 
cd进NVIDIA_CUDA-7.5_Samples中make:

$ cd ~/cuda/NVIDIA_CUDA-7.5_Samples    
$ make

编译结果在 ~/cuda/NVIDIA_CUDA-7.5_Samples/bin/x86_64/linux/release中

(13). 执行编译结果,确认安装配置

$ cd
$ ./cuda/NVIDIA_CUDA-7.5_Samples/bin/x86_64/linux/release/deviceQuery

顺利的话如下图所示,若出错可参考此处 

技术分享

(14). bandwidthTest确认

$ ./cuda/NVIDIA_CUDA-7.5_Samples/bin/x86_64/linux/release/bandwidthTest

确认结果如下图所示则安装成功:

技术分享

 

yy注:之前一上来就make了一次caffe,由于没有装cuda终止了,现在可以再次走一遍caffe的

$ make all 
$ make test 
$ make runtest

缺imdb.h的时候:

$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
出现如下错误的时候:
CXX/LD -o .build_release/tools/convert_imageset.bin 
.build_release/lib/libcaffe.so: undefined reference to cv::imread(cv::String const&, int)’ 
.build_release/lib/libcaffe.so: undefined reference tocv::imencode(cv::String const&, cv::_InputArray const&, std::vector >&, std::vector > const&)’

原因就是opencv3.0.0把imread相关函数放到imgcodecs.lib中了,而非原来的imgproc.lib

解决办法:修改Makefile文件(不是Makefile.config):

在位置{ (LIBRARIES += glog gflags protobuf leveldb snappy lmdb boost_system hdf5_hl hdf5 m opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs) }处添加opencv_imgcodecs

修复错误重新执行上述代码,成功后的截图如下所示: 

技术分享

配置pycaffe

(1) 安装依赖库

$ sudo apt-get install python-numpy python-scipy python-matplotlib python-sklearn python-skimage python-h5py python-protobuf python-leveldb python-networkx python-nose python-pandas python-gflags Cython ipython
$ sudo apt-get install protobuf-c-compiler protobuf-compiler

 

(2) 编译 
进入caffe目录,编译pycaffe

$ cd ~/caffe
$ make pycaffe

(3) 修改环境变量 
添加caffe目录下的python地址到 $PYTHONPATH

$ sudo gedit /etc/profile 
# 末尾添加: export PYTHONPATH = caffe目录下的python地址:$PYTHONPATH,用完整路径,不要用~
 
$ source /etc/profile # 使之生效

(4) 测试 
在terminal进入python,import caffe 如果没错说明安装成功,效果如图:

 技术分享

yy注:你肯定也发现了,事情没有这么顺的。

报ImportError: No module named skimage.io

参照http://www.cnblogs.com/empty16/p/4828476.html

报ImportError: No module named scipy

$ sudo pip install scipy

报ImportError: No module named matplotlib

$ sudo pip install matplotlib

报ImportError: No module named google.protobuf.internal

$ sudo pip install protobuf
使用MNIST数据集进行测试

切换至caffe目录下,下面的工作主要是:用于测试Caffe是否工作正常,不做详细评估。具体设置请参考官网:MNIST数据集在Caffe中的测试 。

数据预处理

$ sh data/mnist/get_mnist.sh

重建lmdb/leveldb文件。Caffe支持三种数据格式输入网络,包括Image(.jpg, .png等),leveldb,lmdb,根据自己需要选择不同输入吧。

$ sh examples/mnist/create_mnist.sh

生成mnist-train-lmdb 和 mnist-train-lmdb文件夹,这里包含了lmdb格式的数据集

训练mnist

$ sh examples/mnist/train_lenet.sh

这时你会在终端窗口中看到caffe的训练过程

 技术分享

 

测试证明caffe应该可以用了,祝各位成功。

64位双系统Ubuntu 14.04 LTS + Caffe + CUDA 7.5 + Opencv 3.0 安装配置实战

标签:tom   方案   技术分享   成功   term   terminal   计算   依次   logs   

原文地址:http://www.cnblogs.com/yying/p/6816069.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!