从零开始在Linux编译VLC-Android开源项目

前言

作为菜鸟到公司的第一天,boss就让我熟悉下VLC的内容,然后总共是第五天才编译出了VLC最新的lib类库和demo工程的apk。之所以标题为“从零开始”,是由于刚接触Linux、shell命令没多久,就要在Linux下进行VLC-Android的交叉编译,尽管只是执行官方的编译脚本,但是新手上路遇到的问题一个接一个。导致五天才编译成功的另外一个原因是,混淆了官方最新代码与公司给的旧版本,所以出现一堆环境配置问题。五天来相当的煎熬,好在前辈们不吝赐教,也由此对Linux和shell更熟悉了一些,到公司实干还是最锻炼人的。

本文以我作为菜鸟的角度来介绍从零开始,到编译出VLC类库和APK的整个过程,所以也会比较啰嗦。

介绍

VLC介绍

VLC是一个免费开源的跨平台多媒体播放器和框架,可以播放众多的多媒体文件,DVD、CD、VCD和各种流协议。VLC使用C语言开发,可跨平台编译为其他系统所用;VLC-Android是将VLC编译为Android可调用类库(*.so)的工程。官网建议在Linux下进行编译,由于依赖的工具包很多,并且VLC编译脚本对工具包版本、代码版本都有严格的hash校验,再加上官方说明并不是很照顾新手,所以出现了很多配置问题。

VLC官网:http://www.videolan.org
VLC源码:http://www.videolan.org/vlc/download-sources.html
VLC依赖:ftp://ftp.videolan.org/pub/contrib/http://download.videolan.org/pub/contrib/
VLC框架介绍:http://www.codeweblog.com/the-architecture-of-vlc-media-framework/
VLC-Android编译官方文档:https://wiki.videolan.org/AndroidCompile/

编译前注意事项

编译VLC-Android的整体流程基本上按照官方文档进行,但是还是会遇到很多问题只有在编译过程中边查边做才知道是怎么回事。

首先,VLC-Android官网只推荐在Linux系统上进行编译,因此需要安装Linux系统或者虚拟机。
第二,既然是编译Android程序,自然需要安装Android SDK(而Android SDK又要求安装JDK);另外,为了使用许多由C/C++语言编写的第三方库,需要安装Android NDK。
第三,整个编译过程通过shell脚本进行,因此需要对shell命令有一定的了解,能够使用常见的shell命令,能通读脚本,也才容易定位编译出错所在。
第四,编译过程中,脚本会通过git来从官网获得代码,用wget从VLC官网或工具包官网下载大量依赖包,依赖包体积不大,但资源基本都是海外网站,因此如果想通过脚本直接完成编译,你必须要会翻墙(使用VPN)。然而我买了付费VPN翻了墙,下载速度还是很慢。所以,还是要会分析脚本知道脚本在做什么,比如从哪个链接下载什么包放到哪里,这样就可以通过迅雷等工具从其他地方下载依赖包后放到指定文件夹。脚本中缺少部分工具时会联网下载,用完后还删了!删了!比如gradle。虽然初衷是好的,但是这在需要重复编译时简直就是噩梦。所以,还可以修改代码,在本地存在一些依赖文件时,不删除、也不重复下载文件。
第五,理想情况下只需要一条命令执行脚本即可完成编译,但是由于众多的依赖包以及国内的墙,基本是不可能的。建议通读脚本后加入一些控制语句,类似断点调试一样地执行脚本。我五天的编译时间基本都是耗在下载包以及关于依赖包的错误上。只要这些依赖包全部正确,通过脚本编译只是时间问题。

编译大致流程

  1. Ubuntu下安装JDK、SDK、NDK
  2. 安装git等工具包以及automake等编译工具包
  3. 各类环境变量的配置
  4. 使用git下载vlc-android代码
  5. 运行脚本开始编译

基础操作

对后文中多次用到的shell命令,和一些操作方法进行统一的介绍。

1、安装/卸载等需要权限的命令前可以加sudo表示最大权限
2、解压(tar.gz与zip两种压缩包)

sudo tar zxvf ./xxx.tar.gz
unzip xxx.zip

3、联网安装Ubuntu程序

sudo apt-get install xxx

4、修改环境变量
打开配置文件~/.bashrc

gedit ~/.bashrc

在文件末尾输入环境变量,如:

export JAVA_HOME=/home/wkw/sdk/jdk1.8.0_121
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
//(注意,不使用export也可以正确配置,使用export后设置的环境变量可以在其他shell脚本中通过$JAVA_HOME访问,这在编译脚本中会用到)

保存~/.bashrc,退出gedit。
重开一个终端即可使环境变量生效,或者在终端中输入以下命令刷新环境变量:

source ~/.bashrc

查看环境变量:

echo $JAVA_HOME

Ubuntu编译环境

编译环境:Windows 10-64bit 下虚拟机装的 Ubuntu 16.04LTS-64bit
编译版本:VLC-(2017.2.27由官网git地址得到,不知道是哪个版本,TESTED_HASH=cd47cfc)

安装工具包

以下是官方文档提供的示例安装命令,实际操作中建议一个一个安装,以便知道安装结果。

sudo apt-get install automake ant autopoint cmake build-essential libtool patch pkg-config protobuf-compiler ragel subversion unzip git

以下安装包依赖其他包,ubuntu会自动一起下载安装;部分包Ubuntu16.04已自带(可更新):

安装包 依赖包
automake autoconf autotools-dev libsigsegv2 m4
ant ant-optional ca-certificates-java default-jre-headless java-common openjdk-8-jre-headless
cmake cmake-data libjsoncpp1
libtool libltdl-dev
protobuf-compiler libprotoc9v5
git git-man liberror-perl
subversion libapr1 libaprutil1 libserf-1-1 libsvn1 (脚本中使用git,多装无妨)
unzip 解压工具,已自带

根据官网描述的所有包中,有部分包在示例安装命令中没有出现,做以下分析:

安装包 描述
make mawk gcc g++ 已自带
gawk 系统未带,要安装
nawk 找不到这个包,不需安装,百度awk nawk mawk gawk的关系
protobuf 其安装包名为protobuf-compiler,需要安装。【新版VLC要求protobuf3】,见下文说明
curl wget 下载工具,需要安装
gettext 需要0.19.3以上版本,已自带0.19.7
yasm 如果要为x86设备编译,需要安装

新版VLC要求使用protobuf3

我2017.2.27从官网git到的VLC在编译环节要求使用protobuf3,而Ubuntu16.04默认的和通过protobuf-compiler安装的是libprotoc2.6.1版本,编译器libprotoc不认识VLC的protobuf3代码,会出现“Unrecognized syntax identifier “proto3””的错误。因此需要手动下载protobuf3,进行安装。

1、查看protobuf版本

protoc --version

2、下载:https://github.com/google/protobuf/releases/download/v3.1.0/protobuf-cpp-3.1.0.tar.gz
3、解压安装:

sudo tar zxvf ./protobuf-cpp-3.1.0.tar.gz    #解压
cd ./protobuf-3.1.0/    #解压出的文件夹
./configure    #运行configure
make
make check
sudo make install
make clean
sudo ldconfig  #更新shared library cache

若以上命令若权限不够(提示“permission denied”),可在命令前加sudo。
4、重开terminal查看protobuf版本,显示:libprotoc 3.1.0

Ubuntu安装Oracle JDK

在ubuntu可以直接使用apt-get安装openjdk,环境变量已配好,但是开发最好用oracle官方版本,并自行配环境变量。

1、下载:jdk-8u121-linux-x64.tar.gz
2、解压

sudo tar zxvf ./jdk-8u121-linux-x64.tar.gz

2*、权限:解压出来的文件夹jdk-8u121-linux-x64右下角有锁,表示有权限限制,可在属性中查看访问权限。若要解除权限可以给予root用户权限:

sudo chmod -R 777 jdk-8u121-linux-x64

给该文件夹递归地赋予root权限,不过jdk一般只需只读,所以没必要
3、JDK环境变量(设置方法见本文开头基础知识部分)

#java jdk
export JAVA_HOME=/home/wkw/sdk/jdk1.8.0_121
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JRE_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_BIN=$JAVA_HOME/bin

请注意,重开terminal环境变量才生效,或者在终端中输入source ~/.bashrc刷新环境变量。
4、验证:输入以下命令,若输出Java相关版本信息说明JDK安装成功

java -version

5、将安装的JDK设置为ubuntu默认JDK
由于Ubuntu可以通过命令联网安装openJDK在根目录下,这会导致Ubuntu将openJDK设置为默认的JDK(java -version出现“openjdk version 1.8.0_121”),需要将自己安装的oracle JDK设为默认。方法如下:

#查看根目录的Java,目前只有openJDK
sudo update-alternatives --config java    

#将oracle JDK安装到根目录
sudo update-alternatives --install /usr/bin/java java /home/wkw/sdk/jdk1.8.0_121/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /home/wkw/sdk/jdk1.8.0_121/bin/javac 300

#再次查看Java配置,输入对应序号,选择oracle JDK作为默认Java
sudo update-alternatives --config java

#再次验证Java版本,可看到切换回了oracle Java
java -version

Ubuntu安装Android SDK

在这之前最好先安装好JDK,因为Android使用JDK

1、下载:tools_r25.2.3-linux.zip,Android Studio不是必须
2、解压:新建一个文件夹android-sdk,并将tools.zip解压在该文件夹下,解压出的文件夹名为tools。

unzip tools_r25.2.3-linux.zip    #解压出的文件夹名为tools

3、SDK环境变量

#android sdk
export ANDROID_SDK=/home/wkw/sdk/android-sdk    #VLC编译脚本只认 $ANDROID_SDK 环境变量
export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools

4、验证:输入android命令,若打开了SDK Manager则说明SDK安装成功,可在SDK Manager中下载需要的SDK版本。建议把5.0(API21)以上的SDK都安装,后续编译APK时对版本有要求

Ubuntu安装Android NDK

最新VLC需要NDK r13以上版本

1、下载:android-ndk-r13b-linux-x86_64.zip
2、解压

unzip android-ndk-r13b-linux-x86_64.zip    #解压出的文件夹名为android-ndk-r13b

3、NDK环境变量

#android ndk
export ANDROID_NDK=/home/wkw/sdk/android-ndk-r13b  #VLC编译脚本只认 $ANDROID_NDK 环境变量
export PATH=$PATH:$ANDROID_NDK

4、验证:

ndk-build

若出现“Android NDK: Could not find application project directory”表示NDK正确安装,只是没有待编译的工程而已,可以android官网下载ndk samples进行编译(这是一个ndk sample

配置VLC环境变量

为VLC指定要编译的设备类型,不设置环境变量时,默认采用armeabi-v7a。更多设备类型请访问官方编译文档。

#vlc-android
export ANDROID_ABI=armeabi-v7a

开始编译

下载vlc-android代码

使用git命令从VLC官网获取最新vlc-android代码(约24M)

git clone https://code.videolan.org/videolan/vlc-android.git

注意:vlc-android只是编译环境的代码,不是vlc源码。vlc源码(约400M)的git地址在vlc-android/compile.sh脚本里定义

确认vlc版本

vlc-android只是编译android apk所需环境的代码,其中的compile.sh脚本是主程序,整个脚本运行完毕会生成vlc播放器的apk。该脚本中会下载vlc源码,并执行另外一个脚本compile-libvlc.sh对vlc源码进行*.so类库的编译。如果只需vlc类库,可只执行compile-libvlc.sh。这两个脚本是整个编译过程的主要脚本,通读这两个脚本会对编译过程有很大帮助。

亲身体会!切忌用“不同版本”vlc-android的脚本编译“不同版本”的vlc代码,因为依赖的包不一样。我就因为用官网最新的vlc-android与其中的脚本编译公司给我的较老版本,出现了很多问题。

剩下的编译工作主要compile.sh与compile-libvlc.sh完成,因此接下来对这两个脚本进行解读,弄懂脚本在做什么,才能对问题进行定位和解决。

compile.sh大纲

compile.sh分为以下部分:

#FUNCTIONS
脚本两个提示信息函数的定义,以及对编译环境(SDK环境变量等)的检查。根据提示配置环境,问题不大。

#GRADLE
这好像是编译APK所需的内容,如果没有正确配置,脚本会自己下载和安装,容易卡在这里。

#Configure gradle
对gradle进行配置,没问题

#Fetch VLC source
下载VLC源码,并会使用脚本中定义的TESTED_HASH对下载的源码进行校验,容易卡在下载上。

#Make VLC
编译VLC,传入参数,执行compile-libvlc.sh进行编译,是整个环节中最重要的部分,也是最容易出问题的部分。如果是只编译类库,单独运行compile-libvlc.sh即可(需配置ABI环境变量或者作为参数传入脚本)

#Compile the UI & RUN
脚本会联网下载VLC的安卓工程进行APK的编译,这会耗点时间。其实通过#Make VLC后基本就是成功了,如果不需要AP可以跳过。

compile.sh解读

下面,对最容易出错的#GRADLE,#Fetch VLC source,#Make VLC 部分的脚本进行说明。
以下脚本中我已经加入了自己的“断点调试”和条件控制,目的是在某些包存在的情况下不再进行重复的下载、删除,一来为了可以自己下载包放到路径,二来为了方便重复编译。要知道,整个编译过程浪费在下载上的时间是最多的。

脚本中我改动的部分都用#"wkw"进行了注释。

GRADLE

#GRADLE部分会检查操作系统是否安装了gradle指定版本(这里是3.3)。脚本会检查vlc-android目录下是否存在gradle-3.3-all.zip安装包,若不存在则下载,若存在则解压到gradle-3.3文件夹。之后进入这个文件夹,运行gradle-3.3/bin/gradle脚本,脚本的作用是根据操作系统配置出一个Java命令,运行/gradle-3.3/gradle/wrapper/gradle-wrapper.jar包,该jar包作用是根据同文件夹下的gradle-wrapper.properties配置文件下载gradle-3.3-bin.zip,下载地址由该配置文件的distributionUrl属性决定。因此,如果下载速度太慢,可以在这里更换地址。

P.S.
使用本地已有的gradle-3.3-bin.zip的方式是,打开根目录下的隐藏文件夹./gradle(即/home/wkw/.gradle),将该包放置于类似这样的路径:/home/wkw/.gradle/wrapper/dists/gradle-3.3-bin/64bhckfm0iuu9gap9hg3r7ev2/gradle-3.3-bin.zip
重新运行脚本即可。注意,如果此时存在/vlc-android/gradle/wrapper路径,需要删除,脚本才能进入gradle的安装步骤。

正确安装gradle后会输出gradle的版本信息表明安装成功。之后脚本会将/vlc-android/gradle-3.3/gradle/wrapper/文件夹移动到/vlc-android/gradle/wrapper/,并以该文件夹是否存在,作为是否进行gradle安装的判断条件。(因此,使用上述本地gradle-3.3-bin.zip安装前需要删除该文件夹让脚本进入安装流程)。

原脚本的最后会删除gradle-3.3-all.zip,建议注释掉该行脚本代码,保留安装包以备后用。
还建议备份/gradle和/gradle-3.3文件夹,因为脚本完成编译后,好像会删除这两个文件夹。

该部分的脚本和我的注释如下:

##########
# GRADLE #
##########

read -p "wkw: press any key to start #GRADLE" wkwarg

if [ ! -d "gradle/wrapper" ]; then
    GRADLE_VERSION=3.3

    #wkw: if there is no gradle-v-all.zip,then download it.
    if [ ! -a "gradle-${GRADLE_VERSION}-all.zip" ]; then
        diagnostic "Downloading gradle"
        GRADLE_URL=https://download.videolan.org/pub/contrib/gradle/gradle-${GRADLE_VERSION}-all.zip
        wget ${GRADLE_URL} 2>/dev/null || curl -O ${GRADLE_URL}
        checkfail "gradle: download failed"
    else
        echo "wkw: #FUNCTIONS find local gradle-${GRADLE_VERSION}-all.zip"
    fi

    unzip -o gradle-${GRADLE_VERSION}-all.zip
    checkfail "gradle: unzip failed"

    #wkw: change gradle-v-bin.zip downloading url.
    echo "wkw: unzip done. Next step will execute gradle-${GRADLE_VERSION}/bin/gradle wrapper.This execution will lead to the downloading of [ gradle-${GRADLE_VERSION}-bin.zip ]. Notice that,you can use a faster download url in gradle-${GRADLE_VERSION}/gradle/wrapper/gradle-wrapper.properties with the value of [ distributionUrl ] AFTER canceling default downloading process (because gradle-${GRADLE_VERSION}/bin/gradle will not be created until this execution)."
    echo "Or,you can place your own [ gradle-${GRADLE_VERSION}-bin.zip ] to the location like /home/wkw/.gradle/wrapper/dists/gradle-3.3-bin/64bhckfm0iuu9gap9hg3r7ev2 , and run compile.sh again(if gradle/wrapper exists,you should remove it first to run this part shell of compile.sh)"
    read -p "Press any key to continue." wkwarg

    cd gradle-${GRADLE_VERSION}

    ./bin/gradle wrapper
    checkfail "gradle: wrapper failed"

    ./gradlew -version
    checkfail "gradle: wrapper failed"
    cd ..
    mkdir -p gradle
    mv gradle-${GRADLE_VERSION}/gradle/wrapper/ gradle
    mv gradle-${GRADLE_VERSION}/gradlew .
    chmod a+x gradlew

    #wkw: keep this package.
    #rm -rf gradle-${GRADLE_VERSION}-all.zip
fi

echo "wkw: #GRADLE done."

Fetch VLC source

该步骤通过git下载官方最新的vlc源码。Windows下vlc代码400m,Linux下100m(文件系统不一样)。git地址:

git clone http://git.videolan.org/git/vlc.git vlc

你可以通过更快的方式git到vlc源码后放入/vlc-android/vlc。该脚本会使用脚本中的TESTED_HASH变量对vlc文件夹进行校验。我遇到的情况是,2017.2.27从VLC源码下载页下载到的vlc-2.2.4.zip解压出的源码无法通过脚本的验证,只有从上述地址git的源码可以通过。也正因为这个校验,如果使用新的compile.sh对旧的vlc源码进行编译,会无法通过这个校验。

Make VLC

该步骤将组织ANDROID_ABI等环境变量作为参数,传给compile-libvlc.sh脚本开始类库的编译过程。编译过程中会检查依赖的包是否安装,未安装则联网下载。这个步骤成功后,基本就是成功了。

下面,对compile-libvlc.sh进行解读,关键步骤在于其中的依赖包的安装。
需要下载的内容主要位于以下两个文件夹

/vlc-android/vlc/extras/tools
/vlc-android/vlc/contrib/tarballs

compile-libvlc.sh解读

这里只解读compile-libvlc.sh中最重要和最容易出错的部分,其他内容可以自行阅读脚本:

FLAGS

本步骤中最重要的是检查操作系统安装的NDK版本,代码如下。可以看到,要求的NDK版本为13以上。关于NDK的版本信息需要自己看这部分的代码,之前用公司给的旧版本脚本,这里是写死了要求版本11。

# try to detect NDK version
REL=$(grep -o '^Pkg.Revision.*[0-9]*.*' $ANDROID_NDK/source.properties |cut -d " " -f 3 | cut -d "." -f 1)

//require NDKv13 or later
if [ "$REL" -ge 13 ]; then
    if [ "${HAVE_64}" = 1 ];then
        ANDROID_API=21
    else
        ANDROID_API=9
    fi
else
    echo "You need the NDKv13 or later"
    exit 1
fi

Build buildsystem tools

该步骤会建立编译所需的系统,会要求使用几个工具包,若不存在这些包,则会联网下载。存放位置位于位于

/vlc-android/vlc/extras/tools

,需要的安装包如下:

  • libtool-2.4.2.tar.gz
  • automake-1.15.tar.gz
  • protobuf-3.1.0.tar.gz
  • pkg-config-0.28-1.tar.gz

脚本需要的安装包名、版本,都会输出在命令行,可以根据这些提示用其他方式下载后放入上述文件夹。

P.S.
这里有点疑问,在进行本步骤之前我已经安装了protobuf-cpp-3.1.0.tar.gz,不知怎么在这里又再次要求下载protobuf-3.1.0.tar.gz,脚本中命令的意思好像是二者选其一,难道这两个包不一样?我重新下载了protobuf-3.1.0.tar.gz放入/extras/tools后本步骤完成。(也许开篇关于protobuf3的步骤可以放到本步骤完成,待之后实验后下定论)

Contribs

该步骤下载VLC代码依赖的包。由于依赖的包众多,下载速度巨慢,该步骤成为了整个脚本最容易出现的问题(缺少包、包版本不对等等)。好在所有依赖包会显示在命令行,可以根据提示手动下载这些依赖包放进指定位置。出现下载慢的包时,终止脚本。复制地址去下载,放入上述文件夹,重新运行脚本。

该步骤中开始执行依赖检查和下载工作的代码是以下这句:

make $MAKEFLAGS fetch
checkfail "contribs: make fetch failed"

脚本会检查依赖包是否位于以下路径,若不存在,这联网下载(超级慢)。

/vlc-android/vlc/contrib/tarballs

要求的包众多,这里就不列出来了。如果完成了该步骤,那么剩下的就是水到渠成了。
P.S.
再次提示,不同编译脚本与不同vlc源码要求的依赖包版本不同,如果在该步骤反复出错,请检查下载的vlc-android和vlc的版本。我就是吃了这个亏。

完成编译

编译成功后,可以在以下目录找到编译完成文件:

  • /vlc-android/vlc-android/build/outputs/apk
    • VLC-Android-2.1.0-ARMv7.apk
  • /vlc-android/libvlc/jni/libs/armeabi-v7a
    • libvlc.so
    • libvlcjni.so
  • /vlc-android/libvlc/private_libs/libs/armeabi-v7a
    • libanw.10.so
    • libanw.13.so
    • libanw.14.so
    • libanw.18.so
    • libanw.21.so
    • libiomx.10.so
    • libiomx.13.so
    • libiomx.14.so

APK编译成功
编译完成

APK运行界面
这里写图片描述

遇到的问题

  • 在compile.sh的#Compile the UI步骤,遇到了以下问题。

The SDK directory ‘/home/wkw/sdk/tools’ does not exist

解决:由于在compile.sh的#GRADLE 步骤完成之后,我改变了一次ANDROID_SDK的位置,而gradle已经配置好的SDK位置未能更新,解决方法是在/vlc-android/local.properties中修改SDK与NDK配置(或重新进行#GRADLE步骤获取新的环境变量)

sdk.dir=/home/wkw/sdk/tools #修改为新的SDK地址
ndk.dir=/home/wkw/sdk/android-ndk-r13b

  • 在compile.sh的#Compile the UI步骤,还遇到了以下问题。

c compiler cannot create executables

实际上,追踪命令行输出,会提示你查看config.log。查看该文件会发现,实际上并不是gcc的问题。根据日志会查到,其实是Android SDK找不到导致的命令无效。原因起源于我在编译了最新的官方版本后,又去编译公司给的旧版本,而旧版本中的compile-libvlc.sh要求的版本是11,因此我从新版本那边copy关于版本校验的脚本代码到旧版本脚本中。观察以下脚本:

#新版脚本
if [ "$REL" -ge 13 ]; then
    if [ "${HAVE_64}" = 1 ];then
        ANDROID_API=21
    else
        ANDROID_API=9
    fi
else
    echo "You need the NDKv13 or later"
    exit 1
fi
#旧版
case "$REL" in
    11*)
        if [ "${HAVE_64}" = 1 ];then
            ANDROID_API=android-21
        else
            ANDROID_API=android-9
        fi
    ;;
    *)
    echo "You need the NDKv11 or later"
    exit 1
    ;;
esac

二者除了对版本的判断(11和>13)不同外,对ANDROID_API赋值也不一样,新版中的API没有”android-“前缀!!!由于赋值粘贴没考虑到这个,导致API赋值错误,以致后面找不到API路径,因此无法编译。

参考

  1. Ubuntu查看/修改环境变量PATH的方法
  2. Android NDK编译C/C++为so共享对象
  3. Linux下编译Android-VLC开源播放器详解(13年的,太旧)
  4. vlc-android源码的编译(16年)

后记

五天搞一个东西真的是要人命了,不过入了门后就好多了。目前已经两次编译成功,不过都是官网最新的版本。后面得把公司给的版本编译过了才行。
本文到此结束,写的是正确的安装流程,所以规避了之前我遇到的很多问题。如果读者有什么问题可以留言,我知道的会回复。希望能帮助到跟我一样手忙脚乱过的萌新。

发布了48 篇原创文章 · 获赞 69 · 访问量 19万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览