Hi, I'm trying to cross compile raylib(essentially glfw w/ extras) from my host x86 archlinux to arm64 linux
/usr/lib/gcc/aarch64-linux-gnu/13.1.0/../../../../aarch64-linux-gnu/bin/ld: cannot find -lX11: No such file or directory
collect2: error: ld returned 1 exit status
^ with cargo build --target aarch64-unknown-linux-gnu , I presume I need the arm64 version of x11 installed or something?
and the following is done with cross
--- stderr
CMake Error at /usr/local/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:164 (message):
Could NOT find X11 (missing: X11_X11_INCLUDE_PATH X11_X11_LIB)
Call Stack (most recent call first):
/usr/local/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:445 (_FPHSA_FAILURE_MESSAGE)
/usr/local/share/cmake-3.17/Modules/FindX11.cmake:366 (find_package_handle_standard_args)
src/external/glfw/src/CMakeLists.txt:187 (find_package)
^ this comes from glfw cmake file, which says it cant find x11, in which case I presume I need to make a docker image and install the deps.
I fixed the cargo build --target aarch64-unknown-linux-gnu by downloading arm x11 so files libx11 (aarch64) | Packages | Arch Linux ARM
and specifying the flags on where to find em in .cargo/config.toml
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
rustflags = ["-L", "/usr/lib/gcc/aarch64-linux-gnu/13.1.0/tmp/usr/lib/"] # should put it somewhere better
Brief warning that Arch Linux ARM is in a dire state of neglect compared to other distributions on ARM. (Arch x86_64 is perfectly healthy.) I'd probably fetch from Debian repos first if I was doing manual downloads.
Build containers or VMs are always going to be the safest bet when linking C libraries when cross-compiling to a Host Tools platform.
I git cloned your repo and ran cross, and I get the message:
CMake Error at src/external/glfw/src/CMakeLists.txt:192 (message):
RandR headers not found; install libxrandr development package
That's a good thing. It's telling you to install libxrandr, whereas previously the build stopped at libx11.
On the raylib repo, it lists the libs it requires. For every library, add a :arm64 postfix like libxrandr-dev:arm64 etc.
You'll need to also modify your build.rs to link to the required libs.
Using Docker (and by extension Cross-rs) can be daunting since it gives you a clean distro with no graphical libs. So you'll have to install all the necessary libs.
Looking at the video, I'm surprised by how quick cross-rs finishes that I find it suspicious. What version are you running of cross-rs?
I'm running cross-rs 0.2.4.
Maybe try to run cargo clean then run again.
I've modified the Cargo.toml to:
[package]
name = "raylib_sandbox"
version = "0.1.0"
edition = "2021"
build = "build.rs"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
raylib = {version="4.5.0", path = "./raylib"}
[package.metadata.cross.target.aarch64-unknown-linux-gnu]
pre-build = [""" \
dpkg --add-architecture arm64 && \
apt-get update && \
apt-get install --assume-yes --no-install-recommends \
libx11-dev:arm64 libxrandr-dev:arm64 libasound2-dev:arm64 \
libx11-dev:arm64 libxrandr-dev:arm64 libxi-dev:arm64 \
libgl1-mesa-dev:arm64 libglu1-mesa-dev:arm64 \
libxcursor-dev:arm64 libxinerama-dev:arm64 \
"""]
And it even goes further:
cross build --target=aarch64-unknown-linux-gnu
[+] Building 233.3s (6/6) FINISHED
=> [internal] load build definition from Dockerfile.aarch64-unknown-linux-gnu-custom 0.7s
=> => transferring dockerfile: 254B 0.0s
=> [internal] load .dockerignore 1.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for ghcr.io/cross-rs/aarch64-unknown-linux-gnu:0.2.4 2.0s
=> CACHED [1/2] FROM ghcr.io/cross-rs/aarch64-unknown-linux-gnu:0.2.4@sha256:3356619b020614effd22e83cec41236e69f 0.0s
=> [2/2] RUN eval " dpkg --add-architecture arm64 && apt-get update && apt-get install --assume-yes --no-insta 224.5s
=> exporting to image 5.0s
=> => exporting layers 3.4s
=> => writing image sha256:9aa7c8f3be35ffb0c09f939a73a25ae0f8416a7871f6d642bb5a127a6d693964 0.1s
=> => naming to docker.io/library/cross-custom-raylib_sandbox:aarch64-unknown-linux-gnu-d5b84-pre-build 0.1s
Compiling libc v0.2.147
Compiling glob v0.3.1
Compiling memchr v2.5.0
Compiling proc-macro2 v1.0.63
Compiling unicode-ident v1.0.10
Compiling quote v1.0.29
Compiling syn v1.0.109
Compiling cfg-if v1.0.0
Compiling minimal-lexical v0.2.1
Compiling libloading v0.7.4
Compiling regex-syntax v0.7.2
Compiling bindgen v0.63.0
Compiling either v1.8.1
Compiling log v0.4.19
Compiling rustc-hash v1.1.0
Compiling cc v1.0.79
Compiling clang-sys v1.6.1
Compiling shlex v1.1.0
Compiling bitflags v1.3.2
Compiling peeking_take_while v0.1.2
Compiling lazy_static v1.4.0
Compiling nom v7.1.3
Compiling lazycell v1.3.0
Compiling which v4.4.0
Compiling cmake v0.1.50
Compiling fs_extra v1.3.0
Compiling raylib_sandbox v0.1.0 (/home/rayloom/dev/raylib_sandbox)
Compiling regex v1.8.4
Compiling cexpr v0.6.0
Compiling raylib-sys v4.5.0 (/home/rayloom/dev/raylib_sandbox/raylib-sys)
warning: unused import: `cmake::build`
--> raylib-sys/build.rs:32:9
|
32 | use cmake::build;
| ^^^^^^^^^^^^
|
= note: `#[warn(unused_imports)]` on by default
warning: `raylib-sys` (build script) generated 1 warning
error: failed to run custom build command for `raylib-sys v4.5.0 (/home/rayloom/dev/raylib_sandbox/raylib-sys)`
Caused by:
process didn't exit successfully: `/target/debug/build/raylib-sys-780ba28df63b6804/build-script-build` (exit status: 101)
--- stdout
CMAKE_TOOLCHAIN_FILE_aarch64-unknown-linux-gnu = None
CMAKE_TOOLCHAIN_FILE_aarch64_unknown_linux_gnu = None
TARGET_CMAKE_TOOLCHAIN_FILE = None
CMAKE_TOOLCHAIN_FILE = None
CMAKE_GENERATOR_aarch64-unknown-linux-gnu = None
CMAKE_GENERATOR_aarch64_unknown_linux_gnu = None
TARGET_CMAKE_GENERATOR = None
CMAKE_GENERATOR = None
CMAKE_PREFIX_PATH_aarch64-unknown-linux-gnu = None
CMAKE_PREFIX_PATH_aarch64_unknown_linux_gnu = None
TARGET_CMAKE_PREFIX_PATH = None
CMAKE_PREFIX_PATH = None
CMAKE_aarch64-unknown-linux-gnu = None
CMAKE_aarch64_unknown_linux_gnu = None
TARGET_CMAKE = None
CMAKE = None
running: cd "/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/build" && CMAKE_PREFIX_PATH="" "cmake" "/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib" "-DCMAKE_BUILD_TYPE=Debug" "-DBUILD_EXAMPLES=OFF" "-DCMAKE_BUILD_TYPE=Release" "-DSUPPORT_BUSY_WAIT_LOOP=OFF" "-DUSE_WAYLAND=OFF" "-DOPENGL_VERSION=OFF" "-DPLATFORM=Desktop" "-DCMAKE_SYSTEM_NAME=Linux" "-DCMAKE_SYSTEM_PROCESSOR=aarch64" "-DCMAKE_INSTALL_PREFIX=/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out" "-DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC" "-DCMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc" "-DCMAKE_CXX_FLAGS= -ffunction-sections -fdata-sections -fPIC" "-DCMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++" "-DCMAKE_ASM_FLAGS= -ffunction-sections -fdata-sections -fPIC" "-DCMAKE_ASM_COMPILER=/usr/bin/aarch64-linux-gnu-gcc"
-- Testing if -Werror=pointer-arith can be used -- compiles
-- Testing if -Werror=implicit-function-declaration can be used -- compiles
-- Testing if -fno-strict-aliasing can be used -- compiles
-- Using raylib's GLFW
-- Including X11 support
-- Audio Backend: miniaudio
-- Building raylib static library
-- Generated build type: Release
-- Compiling with the flags:
-- PLATFORM=PLATFORM_DESKTOP
-- GRAPHICS=GRAPHICS_API_OPENGL_33
-- Configuring done
-- Generating done
-- Build files have been written to: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/build
running: cd "/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/build" && MAKEFLAGS="-j --jobserver-fds=7,8 --jobserver-auth=7,8" "cmake" "--build" "." "--target" "install" "--config" "Debug"
[ 3%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/context.c.o
[ 9%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/input.c.o
[ 9%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/init.c.o
[ 12%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/monitor.c.o
[ 15%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/platform.c.o
[ 18%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/vulkan.c.o
[ 21%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/window.c.o
[ 25%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/egl_context.c.o
[ 28%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/osmesa_context.c.o
[ 31%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/null_init.c.o
[ 34%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/null_monitor.c.o
[ 37%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/null_window.c.o
[ 40%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/null_joystick.c.o
[ 43%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/posix_module.c.o
[ 46%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/posix_time.c.o
[ 50%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/posix_thread.c.o
[ 53%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/x11_init.c.o
[ 56%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/x11_monitor.c.o
[ 59%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/x11_window.c.o
[ 62%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/xkb_unicode.c.o
[ 65%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/glx_context.c.o
[ 68%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/linux_joystick.c.o
[ 71%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/posix_poll.c.o
[ 75%] Linking C static library libglfw3.a
[ 75%] Built target glfw
[ 81%] Building C object raylib/CMakeFiles/raylib.dir/rcore.c.o
[ 81%] Building C object raylib/CMakeFiles/raylib.dir/rmodels.c.o
[ 84%] Building C object raylib/CMakeFiles/raylib.dir/rshapes.c.o
[ 87%] Building C object raylib/CMakeFiles/raylib.dir/rtext.c.o
[ 90%] Building C object raylib/CMakeFiles/raylib.dir/rtextures.c.o
[ 93%] Building C object raylib/CMakeFiles/raylib.dir/utils.c.o
[ 96%] Building C object raylib/CMakeFiles/raylib.dir/raudio.c.o
[100%] Linking C static library libraylib.a
[100%] Built target raylib
Install the project...
-- Install configuration: "Release"
-- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/lib/libraylib.a
-- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/include/raylib.h
-- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/include/rlgl.h
-- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/include/raymath.h
-- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/lib/pkgconfig/raylib.pc
-- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/lib/cmake/raylib/raylib-config-version.cmake
-- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/lib/cmake/raylib/raylib-config.cmake
cargo:root=/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out
cargo:rustc-link-search=native=/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/lib
--- stderr
/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/raudio.c: In function 'LoadMusicStream':
/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/raudio.c:1290:45: warning: passing argument 1 of 'qoaplay_open' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
qoaplay_desc *ctxQoa = qoaplay_open(fileName);
^
In file included from /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/raudio.c:233:0:
/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/external/qoaplay.c:86:15: note: expected 'char *' but argument is of type 'const char *'
qoaplay_desc *qoaplay_open(char *path)
^
In file included from /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/raudio.c:268:0:
/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/external/jar_mod.h: In function 'jar_mod_load_file':
/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/external/jar_mod.h:1541:13: warning: ignoring return value of 'fread', declared with attribute warn_unused_result [-Wunused-result]
fread(modctx->modfile, fsize, 1, f);
^
binding/../raylib/src/raylib.h:82:10: fatal error: 'stdarg.h' file not found
thread 'main' panicked at '
A `libclang` function was called that is not supported by the loaded `libclang` instance.
called function = `clang_getTranslationUnitTargetInfo`
loaded `libclang` instance = 3.8.x
This crate only supports `libclang` 3.5 and later.
The minimum `libclang` requirement for this particular function can be found here:
https://docs.rs/clang-sys/latest/clang_sys/clang_getTranslationUnitTargetInfo/index.html
Instructions for installing `libclang` can be found here:
https://rust-lang.github.io/rust-bindgen/requirements.html
', /cargo/registry/src/index.crates.io-6f17d22bba15001f/clang-sys-1.6.1/src/lib.rs:1735:1
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Trying now with a newer version of libclang.
Edit:
It won't install a newer version of libclang-dev, so the other way is to use cross with a dockerfile.
Trying now...
side note: do you happen to know how I can get the compiled binary to rely on older versions of glibc? My target OS is stuck on ubuntu 18.04 which has glibc2.27 but the cross compiled binaries need glibc2.28 to run
It might be the rustc version which requires a higher glibc.Or the image which links a higher glibc.
I know with cargo-zigbuild you can specify the glibc version you're targeting.
In that case, you might want a docker container and not use cross.
Something like:
FROM ubuntu:bionic AS ubuntu_build
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update -qq
RUN apt-get install -y --no-install-recommends lsb-release g++-aarch64-linux-gnu g++ cmake curl tar git make
RUN apt-get install -y ca-certificates && update-ca-certificates --fresh && export SSL_CERT_DIR=/etc/ssl/certs
RUN dpkg --add-architecture arm64
RUN sed -i "s/deb http/deb [arch=amd64] http/" /etc/apt/sources.list
RUN echo "deb [arch=arm64] http://ports.ubuntu.com/ $(lsb_release -c -s) main multiverse universe" | tee -a /etc/apt/sources.list
RUN echo "deb [arch=arm64] http://ports.ubuntu.com/ $(lsb_release -c -s)-security main multiverse universe" | tee -a /etc/apt/sources.list
RUN echo "deb [arch=arm64] http://ports.ubuntu.com/ $(lsb_release -c -s)-backports main multiverse universe" | tee -a /etc/apt/sources.list
RUN echo "deb [arch=arm64] http://ports.ubuntu.com/ $(lsb_release -c -s)-updates main multiverse universe" | tee -a /etc/apt/sources.list
RUN apt-get update -qq && apt-get install -y --no-install-recommends -o APT::Immediate-Configure=0 libx11-dev:arm64 libxrandr-dev:arm64 libasound2-dev:arm64 \
libx11-dev:arm64 libxrandr-dev:arm64 libxi-dev:arm64 \
libgl1-mesa-dev:arm64 libglu1-mesa-dev:arm64 \
libxcursor-dev:arm64 libxinerama-dev:arm64 clang \
RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain stable --profile minimal -y
ENV PATH="/root/.cargo/bin:$PATH" \
CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ \
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc \
CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++ \
PKG_CONFIG_PATH="/usr/lib/aarch64-linux-gnu/pkgconfig/:${PKG_CONFIG_PATH}"
RUN rustup target add aarch64-unknown-linux-gnu
COPY . .
RUN cargo build --release --target=aarch64-unknown-linux-gnu
FROM scratch AS export-stage
COPY --from=ubuntu_build target/aarch64-unknown-linux-gnu/release/raylib_sandbox .
Which you can run using:
DOCKER_BUILDKIT=1 docker build --file Dockerfile --output out .
This uses Ubuntu Bionic which is 18.04 I think.
If it doesn't work, you can probably add a step to install cargo-zigbuild and use it instead of cargo build.