FROM ubuntu:24.04ENV TZ=Asia/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneRUN sed -i -e 's/^APT/# APT/' -e 's/^DPkg/# DPkg/' /etc/apt/apt.conf.d/docker-cleanRUN apt-get updateRUN apt-get install -y sudo vim wget build-essential cmake gcc g++ libnlopt-dev libnlopt-cxx-dev python3 python3-pip desktop-file-utilsRUN echo 'root:123' | chpasswd#RUN useradd -ms /bin/bash ubuntuRUN echo 'ubuntu:123' | chpasswdRUN usermod -aG sudo ubuntuRUN apt updateRUN apt install localesRUN locale-gen en_US en_US.UTF-8RUN update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8ENV LANG=en_US.UTF-8RUN localeRUN apt install software-properties-common -yRUN add-apt-repository universeRUN apt updateRUN apt install curl -y#ENV ROS_APT_SOURCE_VERSION=`curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}'`#ENV ROS_APT_SOURCE_VERSION=1.1.0#RUN echo "ROS_APT_SOURCE_VERSION: ${ROS_APT_SOURCE_VERSION}"#RUN curl -L -o /home/ubuntu/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"#RUN ls -rlt /home/ubuntu/ros2-apt-source.deb#RUN dpkg -i /home/ubuntu/ros2-apt-source.debRUN curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpgRUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu noble main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/nullUSER ubuntuRUN cat /etc/apt/sources.list.d/ros2.listRUN echo '123' | sudo -S apt updateRUN echo '123' | sudo -S apt install ros-jazzy-desktop-full -yRUN echo '123' | sudo -S apt install ros-jazzy-ros-base -yRUN echo '123' | sudo -S apt install ros-dev-tools -yUSER rootRUN apt-get install -y cmake git wget python3-pip qemu-user-static g++-aarch64-linux-gnu g++-arm-linux-gnueabihfRUN apt-get install -y nlohmann-json3-dev libdw-devRUN apt install -y libopenblas-dev liblapack-devRUN apt install -y libgoogle-glog-dev libgflags-devUSER ubuntuWORKDIR /home/ubuntu
#!/bin/bashdocker build -t x86_ubuntu24_ros2_jazzy:v0.1 -f Dockerfile_x86_ubuntu24 .
ARG ARM_ARCH=arm64v8FROM ${ARM_ARCH}/ubuntu:nobleENV TZ=Asia/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneRUN sed -i -e 's/^APT/# APT/' -e 's/^DPkg/# DPkg/' /etc/apt/apt.conf.d/docker-cleanRUN apt-get updateRUN apt-get install -y sudo vim wget build-essential cmake gcc g++ libnlopt-dev libnlopt-cxx-dev python3 python3-pip desktop-file-utilsRUN echo 'root:123' | chpasswd#RUN useradd -ms /bin/bash ubuntuRUN echo 'ubuntu:123' | chpasswdRUN usermod -aG sudo ubuntuRUN apt updateRUN apt install localesRUN locale-gen en_US en_US.UTF-8RUN update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8ENV LANG=en_US.UTF-8RUN localeRUN apt install software-properties-common -yRUN add-apt-repository universeRUN apt updateRUN apt install curl -y#ENV ROS_APT_SOURCE_VERSION=`curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}'`#ENV ROS_APT_SOURCE_VERSION=1.1.0#RUN echo "ROS_APT_SOURCE_VERSION: ${ROS_APT_SOURCE_VERSION}"#RUN curl -L -o /home/ubuntu/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"#RUN ls -rlt /home/ubuntu/ros2-apt-source.deb#RUN dpkg -i /home/ubuntu/ros2-apt-source.debRUN curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpgRUN echo "deb [arch=arm64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu noble main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/nullUSER ubuntuRUN cat /etc/apt/sources.list.d/ros2.listRUN echo '123' | sudo -S apt updateRUN echo '123' | sudo -S apt install ros-jazzy-desktop-full -yRUN echo '123' | sudo -S apt install ros-jazzy-ros-base -yRUN echo '123' | sudo -S apt install ros-dev-tools -yUSER rootRUN apt install nlohmann-json3-dev libdw-devRUN apt install -y libopenblas-dev liblapack-devRUN apt install -y libgoogle-glog-dev libgflags-devUSER ubuntuWORKDIR /home/ubuntu
#!/bin/bashdocker build --platform linux/arm64 -t aarch64_ubuntu24_ros2_jazzy:v0.1 -f Dockerfile_arm64_ubuntu24 .
首先运行上述构建出的镜像(aarch64_ubuntu24_ros2_jazzy:v0.1)
#!/bin/bashdocker run -it \--name arm_sysroot_ubuntu24 \aarch64_ubuntu24_ros2_jazzy:v0.1 \/bin/bash
然后导出sysroot:
docker container export -o sysroot_docker.tar arm_sysroot_ubuntu24mkdir sysroot_dockertar -C sysroot_docker -xf sysroot_docker.tar lib usr opt etc
导出后可以看到sysroot_docker目录下有lib、usr、opt、etc几个目录,这几个就是交叉编译环境。
data/toolchain_aarch64.cmake:
set(CMAKE_SYSTEM_NAME Linux)set(CMAKE_SYSTEM_VERSION 1)set(CMAKE_SYSTEM_PROCESSOR aarch64)# Specify the cross compilerset(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)set(CMAKE_SYSROOT /opt/sysroot)set(CMAKE_FIND_ROOT_PATH /opt/sysroot/opt/ros/jazzy $ENV{ROS2_WORKSPACE_PATH}/install)set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)# Specify the python SOABIset(PYTHON_SOABI cpython-36m-aarch64-linux-gnu)set(spdlog_DIR ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/spdlog CACHE PATH "" FORCE)set(fmt_DIR ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/fmt CACHE PATH "" FORCE)set(yaml-cpp_DIR ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/yaml-cpp CACHE PATH "" FORCE)set(console_bridge_DIR ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/console_bridge/cmake CACHE PATH "" FORCE)#set(dl_LIBRARY "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/libdl.so.2" CACHE FILEPATH "Path to libdl")if(NOT TARGET Qt5::moc)set(QT_MOC_EXECUTABLE /usr/bin/moc)add_executable(Qt5::moc IMPORTED)set_property(TARGET Qt5::moc PROPERTY IMPORTED_LOCATION ${QT_MOC_EXECUTABLE})endif()# This assumes that pthread will be available on the target system# (this emulates that the return of the TRY_RUN is a return code "0")set(THREADS_PTHREAD_ARG "0"CACHE STRING "Result from TRY_RUN" FORCE)
FROM x86_ubuntu24_ros2_jazzy:v0.1USER rootRUN rm -rf /opt/sysrootCOPY sysroot_docker/ /opt/sysrootCOPY data/toolchain_aarch64.cmake /opt/sysroot/toolchain_aarch64.cmakeRUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/pkgconfig/lapack-openblas.pcRUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.aRUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.so.3RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/liblapack.so.3RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libopenblas.so.0RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.soRUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.aRUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/liblapack.soRUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/liblapack.aRUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libopenblas.soRUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libopenblas.aRUN rm -rf /etc/alternatives/lapack.pc-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/pkgconfig/lapack-openblas.pc /etc/alternatives/lapack.pc-aarch64-linux-gnuRUN rm -rf /etc/alternatives/libblas.a-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.a /etc/alternatives/libblas.a-aarch64-linux-gnuRUN rm -rf /etc/alternatives/libblas.so.3-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.so.3 /etc/alternatives/libblas.so.3-aarch64-linux-gnuRUN rm -rf /etc/alternatives/liblapack.so.3-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/liblapack.so.3 /etc/alternatives/liblapack.so.3-aarch64-linux-gnuRUN rm -rf /etc/alternatives/libopenblas.so.0-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libopenblas.so.0 /etc/alternatives/libopenblas.so.0-aarch64-linux-gnuRUN rm -rf /etc/alternatives/libblas.so-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.so /etc/alternatives/libblas.so-aarch64-linux-gnuRUN rm -rf /etc/alternatives/liblapack.so-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/liblapack.so /etc/alternatives/liblapack.so-aarch64-linux-gnuRUN rm -rf /etc/alternatives/liblapack.a-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/liblapack.a /etc/alternatives/liblapack.a-aarch64-linux-gnuRUN rm -rf /etc/alternatives/libopenblas.so-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libopenblas.so /etc/alternatives/libopenblas.so-aarch64-linux-gnuRUN rm -rf /etc/alternatives/libopenblas.a-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libopenblas.a /etc/alternatives/libopenblas.a-aarch64-linux-gnuUSER ubuntuWORKDIR /home/ubuntu
#!/bin/bashdocker build -t x86_ubuntu24_cross:v0.1 -f Dockerfile_ubuntu24_x86_cross_arm64 .
#!/bin/bashdocker run -it x86_ubuntu24_cross:v0.1 /bin/bashsource /opt/sysroot/opt/ros/jazzy/setup.bash# 使用如下命令编译# colcon build