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进行查看是否有对应的库, 有时候库的版本太多也不行, 需要卸载到不需要的版本。

Apollo-3.0本地编译的更多相关文章

  1. 【转】用串口登录Beaglebone Black、用usb共享电脑网络、内核模块的本地编译

    原文网址:http://bbs.eeworld.com.cn/thread-431507-1-1.html 串口连接BBB使用usb线可以连接BBB和电脑,用ssh就可以登录BBB来进行操作.但有时候 ...

  2. oracle本地编译问题

    oracle10.2: --将过程重新编译为本地编译方式,提示有编译错误,经查提示未设置plsql_native_library_dir 参数 SQL> alter procedure p_xx ...

  3. Saiku二次开发获取源代码在本地编译(五)

    关于Saiku的二次开发,在本地编译然后启动自己编译好的Saiku服务 Saiku是开源的,从github上能下载源代码,本例中的saiku源码也是从github上找的,然后自己改了一些pom.xml ...

  4. 本地编译全志R系列的步骤7(Ubuntu 17.04非长期支持版本)

    本地编译全志R系列的步骤7(Ubuntu 17.04非长期支持版本) 2017/6/29 13:49 0.获取全志R系列的Android源码包: 请通过渠道/代理商/方案公司获取全志R系列的Andro ...

  5. 本地编译全志R系列的步骤(Ubuntu16.04.4版本)

    本地编译全志R系列的步骤(Ubuntu16.04.4版本) 2018/6/14 9:32 版本:V1.0 0.获取全志R系列的Android源码包: 请通过渠道/代理商/方案公司获取全志R系列的And ...

  6. UNICODE本地编译freescale的i.MX6Q的android4.2.2&android4.4.2 && 全志a80的步骤x1

    20151031本地编译freescale的i.MX6Q的android4.2.2&android4.4.2 && 全志a80的步骤x1 2015/10/31 15:07 开始 ...

  7. maven项目引入外部第三方jar包,引入、本地编译、第三方jar一起打到jar中、在linux机器中解决classnotfound(配置classpath),笔记整理。

    文章目录 引用的第三方jar的目录结构(示例) 引入第三方jar进行dependency使项目内能import 本地编译 第三方jar一起打到jar中 在linux机器中解决classnotfound ...

  8. day111:MoFang:邀请好友流程&生成邀请好友二维码&第三方应用识别二维码&本地编译测试&记录邀请人信息

    目录 1.邀请业务逻辑流程图 2.邀请好友-前端 3.邀请好友-后端接口(生成二维码) 4.前端获取后端生成的二维码 5.前端长按页面,保存图片到相册 6.客户端通过第三方识别微信二维码,服务端提供对 ...

  9. hadoop-2.2.0 的编译安装及HA配置

    一 准备工作 准备工作中要求有 1.centOs 6.4,添加hadoop用户,配置集群内的/etc/hosts文件. 2.安装hadoop用户的ssh,并打通集群内所有机器,(ha执行fencing ...

随机推荐

  1. Kafka权威指南 读书笔记之(三)Kafka 生产者一一向 Kafka 写入数据

    不管是把 Kafka 作为消息队列.消息总线还是数据存储平台来使用 ,总是需要有一个可以往 Kafka 写入数据的生产者和一个从 Kafka 读取数据的消费者,或者一个兼具两种角色的应用程序. 开发者 ...

  2. Git(创建与合并分支)

    在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ...

  3. parseFloat()为什么没有效果

    parseFloat() 函数可解析一个字符串,并返回一个浮点数.看清楚说明是操作字符串,如果是数值类型parseFloat([],x)会失去效果. 正确的用法:parseFloat().toFixe ...

  4. Part-Eight 模板与群体数据的组织

    1.方法模板 #include<iostream> using namespace std; template<typename T> void outputArray(con ...

  5. ArcGis辅助编号(半自动)功能的插件式实现

    应邀写了一个ArcGis(ArcMap更确切一些)的辅助编号功能,其实只要想通了实现逻辑,实现的过程蛮简单的.相比挨个儿点要素写进编号或者借助“按键精灵”写入,直接操作宿主真是爽快得不能自已.无图言屌 ...

  6. 一个awk if 嵌套 if 的脚本

    [root@makeISO sjx]# cat sex.sh #!/bin/bash # 统计如下内容,并输出结果 # (男职工未婚数量/男员工整体数量)(女员工未婚数量/女员工整体数量) echo ...

  7. [Android] Android利用Coordinatorlayout+AppbarLayout实现折叠式布局

    折叠式布局在App中相当常见,给人一种科技感,充满良好的用户体验. 本文就以两个简单的例子,来举例说明基本折叠式布局: 首先需要在app/build.gradle下添加如下依赖: compile 'c ...

  8. 【转载】C++ getline函数用法

    https://www.cnblogs.com/xiaofeiIDO/p/8574042.html 摘要: 通过getline()函数一个小小的实例,那么把getline()函数作为while的判断语 ...

  9. HanLP 关键词提取算法分析

    HanLP 关键词提取算法分析 参考论文:<TextRank: Bringing Order into Texts> TextRank算法提取关键词的Java实现 TextRank算法自动 ...

  10. webxml样板

    <!--<!DOCTYPE web-app PUBLIC--> <!--"-//Sun Microsystems, Inc.//DTD Web Application ...