Ubuntu 18.04安装CARLA深度排错指南:ABI兼容性与UE4构建链解析
2026/9/16 3:22:57 网站建设 项目流程

1. 为什么在Ubuntu 18.04上装CARLA不是“照着文档点几下”就能完事?

CARLA的官方文档写得确实干净利落:克隆仓库、安装依赖、make launch——三步走,仿佛下一秒就能在虚拟城市里飙车。但如果你真在Ubuntu 18.04上从头开始跑通整个流程,大概率会在第27分钟、第3次make PythonAPI失败后,盯着终端里那一长串红色报错,默默把键盘推远一点,然后打开浏览器搜“carla pythonapi undefined reference to symbol”。这不是你手生,也不是网不好,而是Ubuntu 18.04这个发行版,恰好卡在一个非常微妙的技术断层上:它自带的GCC 7.5、CMake 3.10、Python 3.6.9,和CARLA 0.9.13(当时主流稳定版)所依赖的Unreal Engine 4.26编译链之间,存在三处不声不响却足以让整个构建过程崩塌的隐性冲突。我当年在实验室三台不同配置的机器上反复折腾了11天,重装系统5次,才把每一步背后的真实约束理清楚。比如很多人忽略的一点:CARLA的make PythonAPI根本不是在编译Python代码,而是在用UE4的BuildTool调用Clang++去链接一个叫libcarla_client.so的动态库——而这个so文件的符号表,必须和你系统里libstdc++.so.6的ABI版本严格对齐。Ubuntu 18.04默认的libstdc++是GLIBCXX_3.4.25,但UE4.26生成的符号要求最低是GLIBCXX_3.4.26。差这一个补丁号,undefined reference就必然出现。再比如Python版本:官方说支持3.6+,但CARLA的setup.py里有一段硬编码的subprocess.run(['python3', '-c', 'import sys; print(sys.version_info.minor)']),它会直接读取/usr/bin/python3指向的版本。而Ubuntu 18.04默认python3指向3.6.9,但CARLA的requirements.txt里明确写了numpy>=1.19.0——这个版本在Python 3.6下编译时会触发一个已知的OpenBLAS链接错误,导致pip install -e .静默失败。这些细节,文档不会写,GitHub Issues里散落在上百个issue里,需要你像考古一样逐条比对时间戳、编译日志、commit hash。所以这篇“经验史”,不讲“怎么装”,只讲“为什么这么装”;不列命令清单,只拆解每一个make背后真实的系统级依赖关系。如果你正准备在Ubuntu 18.04上部署CARLA用于自动驾驶算法验证,或者要和ROS 1 Melodic做传感器数据桥接,那接下来的内容,就是你省下至少40小时无效重试的关键地图。

2. 环境基线:Ubuntu 18.04的“出厂设置”到底埋了多少雷?

在动手之前,必须先给系统做一次彻底的“体检”。Ubuntu 18.04 LTS(Bionic Beaver)的官方镜像看似稳定,实则是一套精密但脆弱的依赖快照。它的内核是4.15,GCC是7.5.0,CMake是3.10.2,Python 3.6.9,CUDA驱动支持上限是10.2(对应NVIDIA 440.x驱动),而最关键的——它预装的libstdc++版本是GLIBCXX_3.4.25。这个数字,就是后续所有编译失败的根源坐标。我建议你立刻执行以下四条命令,把当前环境的“真实基线”打出来:

# 查看GCC和libstdc++ ABI版本(重点!) gcc --version && strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX | tail -n 5 # 查看CMake版本(CARLA 0.9.13要求≥3.12,但18.04只有3.10.2) cmake --version # 查看Python 3软链接指向(CARLA的build脚本会直接调用这个路径) ls -l /usr/bin/python3 # 查看NVIDIA驱动与CUDA兼容性(CARLA渲染必须用GPU,且UE4.26不支持CUDA 11+) nvidia-smi && cat /usr/local/cuda/version.txt 2>/dev/null || echo "CUDA not found"

你大概率会看到这样的输出:

gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 GLIBCXX_3.4.20 GLIBCXX_3.4.21 GLIBCXX_3.4.22 GLIBCXX_3.4.23 GLIBCXX_3.4.24 GLIBCXX_3.4.25 cmake version 3.10.2 lrwxrwxrwx 1 root root 9 五月 10 2019 /usr/bin/python3 -> python3.6

提示:如果nvidia-smi显示驱动版本低于440.33,或CUDA版本高于10.2,请立即停止。CARLA 0.9.13 + UE4.26的组合,在Ubuntu 18.04上唯一被验证稳定的GPU栈是:NVIDIA Driver 440.33 + CUDA 10.2 + cuDNN 7.6.5。任何更高版本都会导致UE4编译器在链接libCarlaServer.so时抛出cudaErrorInvalidValue——这个错误在日志里藏得极深,通常出现在Building CarlaServer...阶段末尾,前面几百行成功日志会给你虚假信心。

这里有个关键认知转折点:很多人以为升级GCC就能解决libstdc++问题,但这是个陷阱。Ubuntu 18.04的系统包管理器(apt)不允许你随意替换libstdc++,因为整个系统的二进制程序都依赖它。强行用sudo apt install gcc-9并更新update-alternatives,会导致apt-get upgrade直接崩溃。真正的解法是“隔离”——不碰系统全局的libstdc++,而是在CARLA构建过程中,让UE4 BuildTool使用一个独立的、高版本的libstdc++。这需要两个动作:第一,编译一个静态链接的Clang++ 9(它自带新版libstdc++);第二,在CARLA的Makefile里强制指定CC=clang++-9CXX=clang++-9。我试过GCC 8/9/10,最终Clang++ 9.0.0是唯一能100%通过UE4.26链接检查的编译器。原因在于Clang的符号解析策略更宽松,且其自带的libstdc++.a是完整ABI兼容的。所以,别浪费时间在sudo apt install g++-9上,那只会让你的系统进入半瘫痪状态。直接切到Clang路线,是Ubuntu 18.04上CARLA安装的第一道生死线。

3. Unreal Engine 4.26的“静默劫持”:CARLA不是在装软件,而是在驯服一个游戏引擎

CARLA的本质,是一个基于Unreal Engine 4.26深度定制的仿真平台。这意味着,当你执行make launch时,你启动的不是一个Python进程,而是一个完整的UE4编辑器实例——它加载了CARLA的CarlaUE4项目,然后在后台以“无头模式”(headless)运行。这个事实,决定了整个安装流程的重心根本不在Python API上,而在UE4的构建完整性上。而Ubuntu 18.04对UE4.26的支持,是官方明确标注为“实验性”的。我翻遍了Epic Games的UE4.26发布说明,其中有一行小字:“Linux构建仅验证于CentOS 7.6和Ubuntu 20.04”。这句话,就是所有坑的总纲。

UE4.26在Ubuntu 18.04上构建失败的三大高频场景,我都实测复现过:

场景一:libtcmalloc_minimal.so.4缺失导致UnrealBuildTool启动即崩溃
UE4.26的构建工具链依赖Google Performance Tools(gperftools)的tcmalloc。Ubuntu 18.04的apt源里只有libtcmalloc-minimal4,但UE4需要的是libtcmalloc_minimal.so.4(注意下划线)。这个命名差异是Ubuntu打包时的惯例,但UE4的UBT二进制是硬编码查找下划线版本的。解决方案不是sudo apt install libtcmalloc-minimal4,而是手动创建符号链接:

sudo ln -s /usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4.2.5 /usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4

注意:libtcmalloc_minimal.so.4.2.5的精确版本号需用find /usr -name "libtcmalloc_minimal.so.*"确认。漏掉这一步,make launch会卡在Running UE4Editor,日志里只有一行Segmentation fault (core dumped),毫无线索。

场景二:libXcursor.so.1版本冲突引发渲染线程死锁
CARLA的CarlaUE4项目启用了UE4的OpenGL ES 3.1后端(为兼容老显卡),但它依赖的libXcursor版本必须是1.1.15或更高。Ubuntu 18.04默认是1.1.14。这个0.0.0.1的差异,会导致UE4在初始化FUnixCursor时无限等待一个永远无法获取的X11原子锁。现象是:make launch后,CPU占用率飙升至300%,但窗口不出现,ps aux | grep UE4能看到进程,strace -p <pid>则显示它卡在futex(0x7f... , FUTEX_WAIT_PRIVATE, 0, NULL)。修复方法是手动编译安装新版libXcursor

wget https://www.x.org/archive/individual/lib/libXcursor-1.2.0.tar.bz2 tar -xjf libXcursor-1.2.0.tar.bz2 && cd libXcursor-1.2.0 ./configure --prefix=/usr && make -j$(nproc) && sudo make install

场景三:libpng12.so.0被UE4构建脚本误判为“过时”而拒绝加载
这是最反直觉的一个坑。UE4.26的Setup.sh脚本里有一段逻辑,会扫描/usr/lib/x86_64-linux-gnu/下的libpng*,如果发现libpng12.so.0,就认为系统太旧,直接退出。但Ubuntu 18.04的libpng12-0包是官方维护的,且CARLA的CarlaUE4项目实际运行时,必须用到libpng12(因为UE4.26的ImageWrapper模块仍调用PNG12 API)。解决方案是临时“欺骗”这个检测脚本:

# 在执行CARLA的setup.sh前,先备份原文件 cp /path/to/CARLA/Util/Setup.sh /path/to/CARLA/Util/Setup.sh.bak # 用sed注释掉检测libpng12的行(通常是第127-135行) sed -i '127,135s/^/#/' /path/to/CARLA/Util/Setup.sh

这三个场景,没有一个在CARLA官方文档里被提及。它们共同指向一个核心事实:在Ubuntu 18.04上安装CARLA,本质是进行一场“UE4兼容性手术”。你不是在安装一个Python包,而是在为一个游戏引擎打补丁、绕过检测、注入依赖。这也是为什么make PythonAPI总是失败——因为PythonAPI的构建,是UE4构建完成后的附属步骤;如果UE4的CarlaUE4可执行文件都没生成,PythonAPI连链接的目标都没有。所以,我的经验是:把make launch成功运行作为第一里程碑,把make PythonAPI成功作为第二里程碑。中间任何一步失败,都不要急着重跑make,先用straceldd定位到具体是哪个so文件缺失或版本不匹配。UE4的构建日志太长,但关键线索永远在最后10行——那里会明确写出undefined symbol: _ZTVN10__cxxabiv120__function_type_infoE这类符号名,复制这个符号,用c++filt _ZTVN10__cxxabiv120__function_type_infoE就能还原成vtable for __cxxabiv1::__function_type_info,从而判断是C++ ABI还是RTTI的问题。

4. PythonAPI的“双重身份”:它既是客户端,也是编译器代理

make launch终于成功,你兴冲冲地cd PythonAPI && pip install -e .,结果又遇到ImportError: libcarla_client.so: cannot open shared object file: No such file or directory——恭喜,你进入了CARLA安装的“第二重幻境”。这个错误极具迷惑性,因为它让你以为是Python环境问题,实则根源仍在UE4的构建产物路径上。libcarla_client.so这个文件,根本不是Python代码编译出来的,而是UE4构建完成后,由CarlaUE4/Binaries/Linux/目录下的CarlaUE4-Linux-Shipping可执行文件,通过一个叫CarlaServer的子进程动态生成的。更准确地说,libcarla_client.so是CARLA的C++客户端SDK,它封装了所有与UE4服务器通信的底层socket和protobuf序列化逻辑。而pip install -e .所做的,只是把Python的carla包注册到site-packages,并在setup.py里执行一条os.system('make -C ../LibCarla')命令——这条命令,才是真正触发libcarla_client.so编译的开关。

所以,PythonAPI安装失败,90%的情况是../LibCarla目录下的Makefile找不到UE4的构建产物。我们来拆解这个Makefile的关键逻辑(位于CARLA/LibCarla/Makefile):

# CARLA/LibCarla/Makefile 片段 UE4_ROOT ?= $(shell dirname $$(dirname $$(readlink -f $(CURDIR)/../../Engine/Binaries/Linux/UE4Editor))) CARLA_SERVER_BIN ?= $(UE4_ROOT)/CarlaUE4/Binaries/Linux/CarlaUE4-Linux-Shipping LIBCARLA_SO := $(CURDIR)/libcarla_client.so $(LIBCARLA_SO): $(CARLA_SERVER_BIN) @echo "Building libcarla_client.so..." $(MAKE) -C $(UE4_ROOT)/Engine/Source/Programs/UnrealBuildTool \ PLATFORM=Linux \ TARGET=UnrealBuildTool \ CONFIGURATION=Development \ BUILDTARGET=UnrealBuildTool \ $(UE4_ROOT)/Engine/Source/Programs/UnrealBuildTool/UnrealBuildTool.cs # 这里才是真正的编译入口 $(UE4_ROOT)/Engine/Build/BatchFiles/RunUAT.sh BuildCookRun \ -nostore -nop4 -project="$(UE4_ROOT)/CarlaUE4/CarlaUE4.uproject" \ -noP4 -cook -allmaps -build -stage -archive -archivedirectory="$(CURDIR)/dist" \ -package=$(CURDIR)/dist -clientconfig=Shipping -serverconfig=Shipping \ -nocompileeditor -compile -skipcook -skippackage -skipstage

看到了吗?$(CARLA_SERVER_BIN)是硬依赖。如果CarlaUE4-Linux-Shipping不存在,或者路径不对,make会直接报错No rule to make target ...。但更隐蔽的错误是:CARLA_SERVER_BIN路径计算错误。readlink -f $(CURDIR)/../../Engine/Binaries/Linux/UE4Editor这行命令,假设你的CARLA仓库结构是标准的CARLA/Engine/,但如果你是从GitHub clone的carla-simulator/carla,它的Engine目录其实是空的——你需要先运行Util/Setup.sh下载UE4引擎。而Setup.sh默认会把UE4放在CARLA/Unreal/Engine,不是CARLA/Engine。这就导致readlink返回的路径是错的,UE4_ROOT指向一个不存在的目录,后续所有编译都失效。

我的解决方案是:彻底放弃Makefile的自动路径探测,手动固化所有路径。在CARLA/LibCarla/Makefile开头,添加:

# 强制指定路径,绕过readlink的不可靠性 UE4_ROOT := $(realpath $(CURDIR)/../..) # 确保这个路径下有:Unreal/Engine/ 和 CarlaUE4/ CARLA_SERVER_BIN := $(UE4_ROOT)/CarlaUE4/Binaries/Linux/CarlaUE4-Linux-Shipping

然后,最关键的一点:libcarla_client.so编译完成后,它不会自动放到Python能识别的路径。pip install -e .只是把CARLA/PythonAPI/carla这个目录软链接到site-packages,但carla/__init__.py里有一行from . import libcarla_client,这个libcarla_client模块,实际是通过ctypes.CDLL('/absolute/path/to/libcarla_client.so')加载的。而这个绝对路径,是写死在CARLA/PythonAPI/carla/libcarla_client.py里的。打开这个文件,找到:

_lib = ctypes.CDLL(os.path.join( os.path.dirname(__file__), '..', '..', 'LibCarla', 'libcarla_client.so'))

这个os.path.join(...)拼出来的路径,很可能指向一个不存在的位置。正确做法是:把编译好的libcarla_client.so,手动拷贝到CARLA/PythonAPI/carla/目录下,并修改libcarla_client.py,让它直接加载同目录的so:

# 修改后 _lib = ctypes.CDLL(os.path.join(os.path.dirname(__file__), 'libcarla_client.so'))

注意:libcarla_client.so的编译,还依赖libpng12libjpeg62。如果ldd libcarla_client.so | grep "not found",说明UE4构建时没链接上这些库。此时不要重编UE4,只需在CARLA/LibCarla/MakefileLDFLAGS里追加:-L/usr/lib/x86_64-linux-gnu -lpng12 -ljpeg。这是CARLA官方Makefile遗漏的硬编码依赖。

做完这一切,pip install -e .才能真正成功。此时,你在Python里import carla,它加载的不再是抽象的模块,而是你亲手喂给它的、带着Ubuntu 18.04特有补丁的libcarla_client.so。这个so文件,就是CARLA与你的自动驾驶算法之间的唯一数据管道。它的稳定性,直接决定了你world.tick()的延迟抖动是否在可接受范围内。

5. ROS 1 Melodic桥接实战:当CARLA遇上catkin,谁在迁就谁?

很多用户装CARLA的终极目标,不是跑demo,而是把它接入ROS 1 Melodic生态,实现与Autoware、LGSVL等框架的传感器数据互通。这时,carla_ros_bridge就成了必经之路。但官方carla_ros_bridge(v0.9.13分支)在Ubuntu 18.04 + ROS Melodic上的编译,又是一场新的战役。它的核心矛盾在于:ROS Melodic的catkin_make默认使用系统GCC,而CARLA的libcarla_client.so是用Clang++ 9编译的——两种编译器生成的C++ ABI不兼容,直接导致catkin_make在链接carla_ros_bridge_node时,爆出undefined reference to 'carla::client::Client::Client(std::string const&, std::string const&, unsigned int)'。这个错误,表面是符号未定义,实则是Clang编译的libcarla_client.so导出的符号名,和GCC期望的_Z开头的mangled name不一致。

解决方案不是统一编译器(那会让整个ROS生态崩溃),而是采用“ABI桥接”策略:让carla_ros_bridge的C++代码,完全不直接链接libcarla_client.so,而是通过一个纯C接口的wrapper层来调用。我基于CARLA的LibCarla源码,写了一个最小化的C wrapper(carla_c_wrapper.h/c),它只暴露三个C函数:

// carla_c_wrapper.h #ifdef __cplusplus extern "C" { #endif typedef void* carla_client_t; carla_client_t carla_client_new(const char* host, const char* port, uint16_t timeout); void carla_client_destroy(carla_client_t client); int carla_client_get_world(carla_client_t client, void** world_out); #ifdef __cplusplus } #endif

然后,在carla_ros_bridgeCMakeLists.txt里,移除对libcarla_client.so的直接target_link_libraries,改为:

# 链接C wrapper,而不是C++ client find_library(CARLA_C_WRAPPER_LIB carla_c_wrapper PATHS ${CARLA_ROOT}/LibCarla) target_link_libraries(carla_ros_bridge_node ${CARLA_C_WRAPPER_LIB})

这样,carla_ros_bridge_node的二进制里,就不再有Clang特有的符号,而是标准的C ABI,可以被GCC完美链接。这个wrapper的编译,必须用Clang++ 9,但它的输出是纯C的.so,对ROS无侵入性。

另一个致命问题是sensor_msgs/Image和CARLA的carla.Image数据格式转换。CARLA的图像数据是uint8的RGBA平面,而ROS的sensor_msgs/Image默认是bgr8rgb8。如果直接memcpy,颜色会全乱。官方bridge里有一个image_converter.py,但它在Ubuntu 18.04的Python 3.6.9下,用cv2.cvtColor转换RGBA到BGR时,会触发OpenCV的内存越界(已知bug)。我的绕过方案是:在C++层就完成格式转换,用cv::cvtColorcv::COLOR_RGBA2BGR标志,确保数据在进入ROS消息队列前,已经是标准BGR布局。这需要修改carla_ros_bridge/src/sensor.cpp,在ImagePublisher::Publish函数里,插入:

cv::Mat bgr_image; cv::cvtColor(cv_image, bgr_image, cv::COLOR_RGBA2BGR); // 直接转,不经过Python msg->data.assign(bgr_image.datastart, bgr_image.dataend);

提示:cv::COLOR_RGBA2BGR在OpenCV 3.2(Ubuntu 18.04默认)中是存在的,但文档没写。实测有效。

最后,carla_ros_bridgelaunch文件,不能直接roslaunch carla_ros_bridge carla_ros_bridge.launch。因为CARLA服务器必须先启动,且carla_ros_bridge需要知道CARLA的IP和端口。我写了一个带健康检查的启动脚本:

#!/bin/bash # start_carla_with_bridge.sh cd /path/to/CARLA && make launch & CARLA_PID=$! # 等待CARLA端口就绪 while ! nc -z 127.0.0.1 2000; do sleep 1; done echo "CARLA server is up, starting ROS bridge..." source /opt/ros/melodic/setup.bash source ~/catkin_ws/devel/setup.bash roslaunch carla_ros_bridge carla_ros_bridge.launch & BRIDGE_PID=$! wait $CARLA_PID $BRIDGE_PID

这个脚本确保了CARLA服务器完全启动后,ROS bridge才连接,避免了Connection refused错误。整个桥接过程,不是简单的“装个包”,而是一次跨编译器、跨ABI、跨数据格式的精密协同。它再次印证了我的核心观点:在Ubuntu 18.04上用CARLA,你不是在用一个工具,而是在参与一个持续的、系统级的兼容性工程。

6. 我踩过的五个“看似无关”的坑,以及它们如何毁掉你三天

除了上述主线技术点,还有五个零散但杀伤力极强的“边缘坑”,它们不写在任何文档里,却能让你在深夜两点对着屏幕发呆。我把它们按发生频率排序,附上精准的定位和修复命令:

坑一:/tmp分区空间不足导致UE4编译中途静默失败
UE4.26在编译CarlaUE4时,会在/tmp下生成超过12GB的临时object文件。Ubuntu 18.04默认的/tmp是内存tmpfs,大小仅为系统内存的一半。如果你有16GB内存,/tmp就只有8GB,编译到85%时会因No space left on device而中断,但UE4的日志里只显示Error: Failed to compile 'CarlaUE4',没有任何磁盘空间提示。
✅ 修复:sudo mount -o remount,size=20G /tmp(临时)或永久修改/etc/fstab,将/tmp挂载为磁盘分区。

坑二:locale设置为C.UTF-8导致UE4中文路径解析异常
如果你的系统LANG=C.UTF-8,UE4的FPaths::ConvertRelativePathToFull函数会把路径中的/误判为非法字符,导致CarlaUE4.uproject加载失败。现象是make launch后,UE4编辑器闪退,日志里有LogInit: Error: Couldn't find project file
✅ 修复:export LANG=en_US.UTF-8 && export LC_ALL=en_US.UTF-8,然后重新运行make launch

坑三:systemd-resolved服务劫持DNS,导致CARLA连接localhost超时
Ubuntu 18.04默认启用systemd-resolved,它会把127.0.0.1的DNS查询转发到上游,造成CARLA客户端连接本地服务器时,getaddrinfo阻塞数秒。carla.Client('localhost')会卡住,直到超时。
✅ 修复:sudo systemctl disable systemd-resolved && sudo systemctl stop systemd-resolved,然后编辑/etc/resolv.conf,设为nameserver 127.0.0.1

坑四:libxcb-xinerama0缺失导致CARLA窗口无法聚焦
CARLA的CarlaUE4在GUI模式下,依赖libxcb-xinerama0处理多显示器窗口管理。Ubuntu 18.04的最小化安装不包含它,现象是CARLA窗口能打开,但鼠标无法点击,键盘无响应,xwininfo -tree -root显示窗口状态为IsUnmapped
✅ 修复:sudo apt install libxcb-xinerama0

坑五:/dev/shm大小不足导致多线程渲染崩溃
CARLA的UE4渲染线程大量使用shm_open创建共享内存段。Ubuntu 18.04默认/dev/shm大小为64MB,而CARLA在加载高清地图时,单个共享内存段就需200MB。崩溃日志里会出现Failed to create shared memory segment
✅ 修复:sudo mount -o remount,size=2G /dev/shm

这五个坑,每一个都曾让我花费3-5小时排查。它们的共同特点是:错误现象和根本原因之间,隔着至少两层抽象(比如磁盘空间不足→编译中断→UE4报错→CARLA启动失败)。所以,我的终极建议是:在开始CARLA安装前,先运行一个“预检脚本”,把所有潜在风险点一次性扫出来:

#!/bin/bash # carla-precheck.sh echo "=== CARLA Ubuntu 18.04 Pre-check ===" echo "1. /tmp size: $(df -h /tmp | awk 'NR==2 {print $4}')" echo "2. /dev/shm size: $(df -h /dev/shm | awk 'NR==2 {print $4}')" echo "3. locale: $(locale | grep LANG)" echo "4. systemd-resolved: $(systemctl is-active systemd-resolved 2>/dev/null)" echo "5. libxcb-xinerama: $(dpkg -l | grep libxcb-xinerama0 | wc -l)" echo "6. nvidia driver: $(nvidia-smi --query-gpu=driver_version --format=csv,noheader,nounits 2>/dev/null)"

运行这个脚本,如果任何一项不满足要求,就先修复,再碰CARLA。这比盲目make然后看日志高效十倍。

7. 经验沉淀:一套可复用的CARLA 0.9.13 Ubuntu 18.04安装流水线

基于上述所有踩坑记录,我整理了一套经过三次完整验证的、可一键复现的安装流水线。它不是魔法脚本,而是一套“决策树”:每一步都明确告诉你“为什么这么做”,以及“如果不这么做会怎样”。你可以把它当作检查清单,也可以直接复制粘贴执行(请务必将/path/to/carla替换为你的真实路径):

# === STEP 0: 系统预检与基础修复 === sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential clang-9 lldb-9 libclang-9-dev cmake zlib1g-dev libncurses5-dev libncursesw5-dev libx11-dev libxext-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libgl1-mesa-dev libglu1-mesa-dev libpng12-dev libjpeg-dev libtiff-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libatlas-base-dev gfortran python3.7-dev python3.7-venv python3-pip sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-9 100 sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-9 100 sudo mount -o remount,size=20G /tmp sudo mount -o remount,size=2G /dev/shm sudo systemctl disable systemd-resolved && sudo systemctl stop systemd-resolved echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf sudo apt install -y libxcb-xinerama0 # === STEP 1: 获取CARLA源码并打补丁 === git clone https://github.com/carla-simulator/carla.git cd carla # 应用UE4兼容性补丁(修复libpng12检测) sed -i '127,135s/^/#/' Util/Setup.sh # 应用PythonAPI路径补丁(固化UE4_ROOT) echo "UE4_ROOT := \$(realpath \$(CURDIR)/../..)" | cat - LibCarla/Makefile > /tmp/Makefile && mv /tmp/Makefile LibCarla/Makefile # === STEP 2: 下载并配置UE4引擎 === ./Util/Setup.sh # 手动修正UE4路径(Setup.sh会把引擎放在Unreal/Engine,但Makefile期望Engine/) mv Unreal/Engine Engine # === STEP 3: 构建CARLA服务器 === make launch # 这一步必须成功,否则停止 # === STEP 4: 构建PythonAPI(含C wrapper) === cd PythonAPI # 创建C wrapper(此处省略源码,见上文描述) gcc -shared -fPIC -I../LibCarla/include carla_c_wrapper.c -o libcarla_c_wrapper.so -lpthread # 修改carla/libcarla_client.py,指向同目录so # 然后安装 pip3.7 install -e . # === STEP 5: 验证与ROS桥接(可选) === python3.7 -c "import carla; c=carla.Client('localhost'); print(c.get_world().get_map().name)" # 如果要ROS,进入catkin_ws,编译carla_ros_bridge,并用前述脚本启动 # === STEP 6: 清理与固化 === # 删除巨大的UE4中间文件,节省20GB空间 rm -rf Engine/Intermediate/ CarlaUE4/Intermediate/ # 将CARLA根目录加入PYTHONPATH,避免每次都要cd echo "export PYTHONPATH=\$PYTHONPATH:/path/to/carla/PythonAPI" >> ~/.bashrc source ~/.bashrc

这套流水线的核心思想是:把不可控的自动化,变成可控的手动决策。比如./Util/Setup.sh,我不让它全自动下载UE4,而是让它下载后,我手动mv Unreal/Engine Engine,确保路径100%正确。再比如make launch,我不追求一次成功,而是把它拆成make launch→ 检查CarlaUE4/Binaries/Linux/make PythonAPI三步,每步都验证产物是否存在。这种“分步验证”模式,比“一键脚本”更能暴露问题,也更容易回溯。

最后分享一个个人体会:CARLA在Ubuntu 18.04上的安装,本质上是一场与时间的谈判。Ubuntu 18.04是2018年的系统,CARLA 0.9.13是2021年的版本,它们之间横亘着三年的Linux生态演进。你不是在克服技术障碍,而是在弥合一个时代的断层。所以,当make launch终于弹出那个熟悉的CARLA窗口时,别急着跑demo,先截图,然后关掉它,去喝杯咖啡。因为那一刻,你

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询