1. 程式人生 > >Apollo-3.0本地編譯

Apollo-3.0本地編譯

Apollo-3.0本地編譯

  • 用docker編譯所用的dev.x86_64.dockerfile檔案(具體位置在apollo/docker/build)中有所有的依賴庫或包, 還會執行一些shell指令碼, 這些shell指令碼主要存放在apollo/docker/build/installers檔案中。

第一步,安裝依賴庫

  • 其實也就是按著dev.x86_64.dockerfile檔案進行執行, 把RUN改為shell執行罷了。
    sudo apt-get update -y && \
    sudo apt-get install -y \
    apt-transport-https \
    bc \
    build-essential \
    cmake \
    cppcheck \
    curl \
    debconf-utils \
    doxygen \
    gdb \
    git \
    google-perftools \
    graphviz \
    lcov \
    libblas-dev \
    libboost-all-dev \
    libcurl4-openssl-dev \
    libfreetype6-dev \
    liblapack-dev \
    libpcap-dev \
    locate \
    lsof \
    nfs-common \
    realpath \
    shellcheck \
    software-properties-common \
    sshfs \
    subversion \
    unzip \
    v4l-utils \
    vim \
    wget \
    zip 

第二步, 安裝apollo第三方庫

  • 其實就是把apollo/docker/build/installers資料夾下的shell腳本里面的命令執行一遍, 但要注意的是這些shell指令碼都會刪掉原始包,為了以防安裝過程出錯可以選擇性的不刪掉。
  • 值得注意的是bazel編譯檔案把依賴的庫寫到了本地目錄/home/tmp, 所以需要自己建立這個目錄並把一些第三方庫的壓縮包放到該目錄下, 具體可以參看install_bazel_packages.sh目錄:
mkdir -p /home/tmp
cd /home/tmp

wget -O opencv-2.4.13.2.zip \
    https://github.com/opencv/opencv/archive/2.4.13.2.zip
wget -O googletest-release-1.8.0.tar.gz \
    https://github.com/google/googletest/archive/release-1.8.0.tar.gz
wget -O gflags-2.2.0.tar.gz \
    https://github.com/gflags/gflags/archive/v2.2.0.tar.gz
wget -O glog-0.3.5.tar.gz \
    https://github.com/google/glog/archive/v0.3.5.tar.gz
wget -O benchmark-1.1.0.tar.gz \
    https://github.com/google/benchmark/archive/v1.1.0.tar.gz
wget -O eigen-3.2.10.tar.gz \
    https://bitbucket.org/eigen/eigen/get/3.2.10.tar.gz
wget -O civetweb-1.10.tar.gz \
    https://github.com/civetweb/civetweb/archive/v1.10.tar.gz
wget -O curlpp-0.8.1.tar.gz \
    https://github.com/jpbarrette/curlpp/archive/v0.8.1.tar.gz
wget -O yaml-cpp-0.5.3.zip \
    https://github.com/jbeder/yaml-cpp/archive/yaml-cpp-0.5.3.zip
wget -O qp-oases-3.2.1-1.zip \
    https://github.com/startcode/qp-oases/archive/v3.2.1-1.zip
wget -O proj.4-4.9.3.zip \
    https://github.com/OSGeo/proj.4/archive/4.9.3.zip
wget -O tinyxml2-5.0.1.zip \
    https://github.com/leethomason/tinyxml2/archive/5.0.1.zip
wget -O protobuf-3.3.0.tar.gz \
    https://github.com/google/protobuf/releases/download/v3.3.0/protobuf-cpp-3.3.0.tar.gz
  • 執行完這些指令碼基本的環境就OK了, 如果出現一些錯誤, 一般google一下就能解決, 如果實現不能解決的可以參考docker裡面apollo的環境, 具體進入命令為:
bash docker/scripts/dev_start.sh && bash docker/scripts/dev_into.h
  • 因為docker環境被對映到了本地目錄, 可以把docker裡面的一些庫檔案直接拷貝出來。
  • 依賴庫和第三方庫的版本最好和apollo中的保持一致, 庫或包的版本太新或太舊都可能出現莫名其妙的問題;比如gflag的版本通過sudo apt-get install libgflags-dev
    安裝的話, 就有可能出現gflag命名空間出錯的問題。

第三步, 開始編譯

  • 編譯其實和在docker中編譯沒有太大的區別, 直接執行apollo.sh指令碼就行, 但是要注意的是, 該指令碼會檢查是否是在docker環境下, 所以需要將function source_apollo_base()函式中check docker environment的if語句註釋掉,具體為:
function apollo_check_system_config() {
  # check docker environment
  # if [ ${MACHINE_ARCH} == "x86_64" ] && [ ${APOLLO_IN_DOCKER} != "true" ]; then
  #   echo -e "${RED}Must run $0 in dev docker or release docker${NO_COLOR}"
  #   exit 0
  # fi

  # check operating system
  OP_SYSTEM=$(uname -s)
  case $OP_SYSTEM in
    "Linux")
      echo "System check passed. Build continue ..."

      # check system configuration
      DEFAULT_MEM_SIZE="2.0"
      MEM_SIZE=$(free | grep Mem | awk '{printf("%0.2f", $2 / 1024.0 / 1024.0)}')
      if (( $(echo "$MEM_SIZE < $DEFAULT_MEM_SIZE" | bc -l) )); then
         warning "System memory [${MEM_SIZE}G] is lower than minimum required memory size [2.0G]. Apollo build could fail."
      fi
      ;;
    "Darwin")
      warning "Mac OS is not officially supported in the current version. Build could fail. We recommend using Ubuntu 14.04."
      ;;
    *)
      error "Unsupported system: ${OP_SYSTEM}."
      error "Please use Linux, we recommend Ubuntu 14.04."
      exit 1
      ;;
  esac
}
  • 然後執行./apollo.sh build_cpu就可以愉快的編譯了, 但是可能編譯的時候會出現各種錯誤, 特別要關注那些錯誤提醒, 一般都是包沒有安裝完全, 將對應包放到對應目錄下就可以了。

第四步, 錯誤修改

  • 運氣好的話應該可以一次編譯通過, 如果出現錯誤也不用慌,先弄清楚為什麼出現這個錯誤(主要依據錯誤提示), 然後Google解決方案, 實在沒有辦法的話, 最直接的方案是把docker中的動態庫拷貝到對應位置。
  • 以下是幾個常見的問題:
    1. Bazel的安裝版本太新, bazel官方安裝教程, apollo編譯用的是bazel-0.5.3,如果版本太新的話需要解除安裝後重新安裝0.5.3版本。
    2. 一些計算庫找不到標頭檔案, 直接從docker裡面拷貝即可,也可以先查清楚是那個計算庫, 再安裝即可。
      3.OpenGL庫及其相關庫沒有安裝, 需要安裝glfw和glut等, glfw安裝教程sudo apt-get install freeglut3-dev來安裝glut。
    3. 沒有顯示卡或是沒有GPU也需要安裝cudnn的庫, 主要是在NVIDIA官方註冊下載庫(其實就是動態連結庫和靜態連結庫的集合), 然後拷貝到放庫的目錄, 一般為/usr/local/lib中。
    4. 如果提示沒有動態連結庫, 可以通過sudo ld -l庫名稱 --verbose進行檢視是否有對應的庫, 有時候庫的版本太多也不行, 需要解除安裝到不需要的版本。