# 在ubuntu22.04中以源码的方式编译carla0.9.15 ## 前言 ​ 简单来说,carla其实提供了两个版本。一个是为了给大家提供方便的安装版,也就是precompiled版本,这个版本安装比较方便,即插即用,适合在校学生做科研和一些通用的算法验证。另外一个是source build的版本,这个版本给开发者提供了更多的想象空间,基本上底层的很多东西你都是可以去进行修改的。**而如果你要用C++去进行开发的话,那么你就得需要安装source build的版本**。这里的话我会对两个版本的安装方法以及遇到的一些问题都进行一些介绍。 ## 安装编译器 ```shell sudo apt-get update && sudo apt-get install wget software-properties-common && sudo add-apt-repository ppa:ubuntu-toolchain-r/test && wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add ``` 安装所需要的编译器 ```shell sudo apt-add-repository "deb http://archive.ubuntu.com/ubuntu focal main universe" sudo apt-get update sudo apt-get install build-essential clang-10 lld-10 g++-7 cmake ninja-build libvulkan1 python python3 python3-dev python3-pip libpng-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git git-lfs sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-10/bin/clang++ 180 && sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-10/bin/clang 180 && sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 180 ``` **注意,如果电脑上安装了多个版本的gcc,需要检查相关配置,避免在编译期间出现问题** 在终端中输入 ```shell clang++ -v ----------------------------- # 以下是显示的结果 clang version 10.0.0-4ubuntu1 Target: x86_64-pc-linux-gnu Thread model: posix InstalledDir: /usr/bin Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7 Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7.5.0 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.5.0 Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7.5.0 # 这一行要注意 Candidate multilib: .;@m64 Selected multilib: .;@m64 ``` **编译carla使用的是gcc-7 ,所以一定要确保clang++ 选择的gcc版本是7/7.50** 如果版本不对,解决方案如下 ```shell # clang++ 或者clang 默认会选择目录(/usr/lib/gcc/x86_64-linux-gnu)下版本最高的gcc # 我没有找到其它方法来让他改变选择的gcc版本,最简单粗暴得方法就是把其他版本的gcc删除或者移动到其他目录,让7版本是最高的版本 ``` **注意** 当你通过 update-alternatives 切换到不同版本的 GCC 时,它仅影响 GCC 和 G++ 的命令。clang++ 是一个独立的编译器,它在执行时会查找系统上安装的 GCC 版本以进行某些操作,但并不会受到 update-alternatives 的影响。因此,clang++ 显示的 GCC 版本仍然是它在编译时找到的版本。影响的仅是在使用gcc时,默认选择你设置的gcc的版本,eg: ![image-20241018105247247](/assert/image-20241018105247247.png) 当通过update-alternatives配置默认的gcc(前提是不同版本的gcc 已经使用update-alternatives install进行安装) ![image-20241018105548321](/assert/image-20241018105548321.png) 这时候再使用clang++ -v 查看选择的gcc版本 并没有受到影响 ## 配置安装Python相关依赖 ```shell # For Python 3 pip3 -V pip3 install --upgrade pip # For Python 2 pip -V pip install --upgrade pip pip install --user setuptools && pip3 install --user -Iv setuptools==47.3.1 && pip install --user distro && pip3 install --user distro && pip install --user wheel && pip3 install --user wheel auditwheel==4.0.0 ``` ## 编译unreaEngine ```shell git clone --depth 1 -b carla https://github.com/CarlaUnreal/UnrealEngine.git . ``` 克隆这一步网上说了一大堆,包括官方,还要切换分支之类的,根本不需要,直接克隆最新的就行,因为后面克隆carla源码是也是克隆最新的。这样不会缺少对应的依赖 clone的时候需要验证你的github账户 1. 首先进入[UE官网](https://link.zhihu.com/?target=https%3A//www.unrealengine.com/zh-CN/feed) 和自己的Github账号进行关联。右上角登录过后进入:个人/应用与账户。关联上自己的Github账户; 2. 需要注意的是git clone UE的过程中需要用github 账户登入,但从2021年开始Github不支持这种登入方式,需要设置Personal Access Token。设置方法参考:[Github - 使用新的Personal Access Token进行仓库认证](https://link.zhihu.com/?target=https%3A//blog.csdn.net/HW140701/article/details/119699169) 。 ```shell cd your/unreaEngin/folder ./Setup.sh && ./GenerateProjectFiles.sh && make # ./Setup.sh 需要从网上下载依赖,大约十几个G,中间如果断开,可以再次执行,已下载不会再重新下载了 # 在你的虚幻根目录 cd Engine/Binaries/Linux && ./UE4Editor # 第一次运行加载速度很慢 ``` 设置环境变量, 将虚幻的根目录加到环境变量 ```shell echo "UE4_ROOT=your/unreaEngin/folder" >> ~/.bashrc source ~/.bashrc ``` ## 编译carla ```shell git clone https://github.com/carla-simulator/carla.git . ``` clone最新的就行,不用切换分支。 1. 下载资源,主要是一些蓝图资源。天气,汽车 ,地图之类的,不是很重要,不弄也不影响下面的编译,可以有时间再弄 ```shell ./Update.sh # 下载资产 ``` 2. 编译Python client 和 观众视角(服务器) ```shell # 不要使用sudo make PythonAPI make launch # 没有先后顺序,一定要保证,前面的虚幻编译成功,并且环境变量设置好,再次检查clang++选择的gcc版本 ``` 3. 编译cpp依赖库 ```shell cd carla/root mkdir build # 名字自定义 cd build cmake .. \ -G "Ninja" \ -DCMAKE_BUILD_TYPE=Client \ -DLIBCARLA_BUILD_RELEASE=ON \ -DLIBCARLA_BUILD_DEBUG=OFF \ -DLIBCARLA_BUILD_TEST=OFF \ -DCMAKE_TOOLCHAIN_FILE=./Examples/CppClient/ToolChain.cmake \ -DCMAKE_INSTALL_PREFIX=./ # 说明 # -DCMAKE_INSTALL_PREFIX 编译好后,库文件和头文件的安装目录 自由指定 # -DLIBCARLA_BUILD_RELEASE=ON -DLIBCARLA_BUILD_DEBUG=OFF 指定编译模式 ninja cmake --install . # 如果没有在上述cmake命令中指定CMAKE_INSTALL_PREFIX # cmake --install . --prefix your/install/folder ``` ## 运行PythonAPI中实例Python代码(可选) calar中使用的是python 3.7 如果安装了其他版本的python,需要使用conda切换python版本 1. 安装python依赖 ```shell pip install carla ``` 2. 运行 python 例子(保证上述make launch 成功启动了server) ## 使用C++编写客户端代码 CMakeLists.txt ```cmake cmake_minimum_required(VERSION 3.26) project(test) # your project name set(CMAKE_CXX_STANDARD 14) # 替换成自己下载的路径 set(CARLA_LIB "$ENV{HOME}/Desktop/carla_lib") add_executable(${PROJECT_NAME} main.cpp) target_include_directories(${PROJECT_NAME} PRIVATE ${CARLA_LIB}/include) target_link_directories(${PROJECT_NAME} PRIVATE ${CARLA_LIB}/lib) target_compile_options(${PROJECT_NAME} PRIVATE -isystem ${CARLA_LIB}/include/system) target_link_libraries(${PROJECT_NAME} PRIVATE -Wl,-Bstatic -lcarla_client -lrpc -lboost_filesystem -Wl,-Bdynamic -lpng -ltiff -ljpeg -lRecast -lDetour -lDetourCrowd -pthread) ```