Search code examples
cmakeraspberry-pibinaryarmraspbian

How to compile a source into an ARM binary


I want to compile VTK-DICOM to run on an ARM Raspberry Pi (Raspbian). Is it posible? Where should I start?


Solution

  • Building for Raspbian Debian Buster images and ARMv6

    This tutorial also supports older Rasperry Pi (A, B, B+, Zero) based on the ARMv6 CPU. See also: GCC 8 Cross Compiler outputs ARMv7 executable instead of ARMv6

    Set up the toolchain

    There is no official git repository containing an updated toolchain (See https://github.com/raspberrypi/tools/issues/102).

    Here is a github repository which includes building and precompiled toolchains for ARMv6 based on GCC8 and newer:

    https://github.com/Pro/raspi-toolchain

    As mentioned in the project's readme, these are the steps to get the toolchain. You can also build it yourself (see the README for further details).

    1. Download the toolchain:
    wget https://github.com/Pro/raspi-toolchain/releases/latest/download/raspi-toolchain.tar.gz
    
    1. Extract it. Note: The toolchain has to be in /opt/cross-pi-gcc since it's not location independent.
    sudo tar xfz raspi-toolchain.tar.gz --strip-components=1 -C /opt
    
    1. You are done! The toolchain is now in /opt/cross-pi-gcc

    2. Optional, add the toolchain to your path, by adding:

    export PATH=$PATH:/opt/cross-pi-gcc/bin
    

    to the end of the file named ~/.bashrc

    Now you can either log out and log back in (i.e. restart your terminal session), or run . ~/.bashrc in your terminal to pick up the PATH addition in your current terminal session.

    Get the libraries from the Raspberry PI

    To cross-compile for your own Raspberry Pi, which may have some custom libraries installed, you need to get these libraries onto your host.

    Create a folder $HOME/raspberrypi. In your raspberrypi folder, make a folder called rootfs.

    Now you need to copy the entire /liband /usr directory to this newly created folder. I usually bring the rpi image up and copy it via rsync:

    rsync -vR --progress -rl --delete-after --safe-links [email protected]:/{lib,usr,opt/vc/lib} $HOME/raspberrypi/rootfs
    

    where 192.168.1.PI is replaced by the IP of your Raspberry Pi.

    Use CMake to compile your project

    To tell CMake to take your own toolchain, you need to have a toolchain file which initializes the compiler settings.

    Get this toolchain file from here: https://github.com/Pro/raspi-toolchain/blob/master/Toolchain-rpi.cmake

    Now you should be able to compile your cmake programs simply by adding this extra flag: -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake and setting the correct environment variables:

    export RASPBIAN_ROOTFS=$HOME/raspberry/rootfs
    export PATH=/opt/cross-pi-gcc/bin:$PATH
    export RASPBERRY_VERSION=1
    cmake -DCMAKE_TOOLCHAIN_FILE=$HOME/raspberry/Toolchain-rpi.cmake ..
    

    An example hello world is shown here: https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh

    Source:

    https://stackoverflow.com/a/58559140/13859552