diff --git a/GGMLSharp/GGMLSharp.csproj b/GGMLSharp/GGMLSharp.csproj
index f87aac8..af43fad 100644
--- a/GGMLSharp/GGMLSharp.csproj
+++ b/GGMLSharp/GGMLSharp.csproj
@@ -66,10 +66,35 @@
-
-
- PreserveNewest
+
+
+
+ %(Filename)%(Extension)
+
+
+
+
+
+ %(Filename)%(Extension)
+
+
+
+
+
+ %(Filename)%(Extension)
+
+
+
+ %(Filename)%(Extension)
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/GGMLSharp/Native.cs b/GGMLSharp/Native.cs
index eb34cec..f787247 100644
--- a/GGMLSharp/Native.cs
+++ b/GGMLSharp/Native.cs
@@ -20,7 +20,7 @@ namespace GGMLSharp
{
internal unsafe class Native
{
- public const string DllName = "ggml";
+ public const string DllName = "libggml";
#region ggml.h
diff --git a/GGMLSharp/build/Dockerfile b/GGMLSharp/build/Dockerfile
new file mode 100644
index 0000000..fe70242
--- /dev/null
+++ b/GGMLSharp/build/Dockerfile
@@ -0,0 +1,109 @@
+FROM ubuntu:25.04 AS base
+
+ARG GGML_COMMIT=master
+
+RUN apt-get update && \
+ apt-get install -y git cmake build-essential ccache wget tar
+
+WORKDIR /src
+
+RUN git clone --filter=blob:none --no-checkout https://github.com/ggml-org/ggml.git && \
+ cd ggml && \
+ git checkout ${GGML_COMMIT} && \
+ sed -i '4598s/$/;/' src/ggml-quants.c # This is a quick patch needed for older GGML versions to get it to compile for windows
+
+WORKDIR /src/ggml/build
+
+FROM base AS win-base
+
+ENV LLVM_MINGW_VERSION=20250717
+ENV LLVM_MINGW_BASE=llvm-mingw-${LLVM_MINGW_VERSION}-ucrt-ubuntu-22.04-x86_64
+ENV LLVM_MINGW_ARCHIVE=${LLVM_MINGW_BASE}.tar.xz
+ENV LLVM_MINGW_PATH=/src/${LLVM_MINGW_BASE}
+
+WORKDIR /src
+
+RUN wget https://github.com/mstorsjo/llvm-mingw/releases/download/${LLVM_MINGW_VERSION}/${LLVM_MINGW_ARCHIVE} && \
+ tar -xf ${LLVM_MINGW_ARCHIVE}
+
+
+WORKDIR /src/ggml/build
+
+FROM win-base AS win-x64-builder
+
+ENV TOOLCHAIN_FILE=/src/ggml/build/toolchain-windows-x64.cmake
+
+RUN echo "set(CMAKE_SYSTEM_NAME Windows)" > ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_C_COMPILER ${LLVM_MINGW_PATH}/bin/x86_64-w64-mingw32-clang)" >> ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_CXX_COMPILER ${LLVM_MINGW_PATH}/bin/x86_64-w64-mingw32-clang++)" >> ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_FIND_ROOT_PATH ${LLVM_MINGW_PATH}/x86_64-w64-mingw32)" >> ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)" >> ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)" >> ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)" >> ${TOOLCHAIN_FILE}
+
+RUN cmake .. \
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_FILE} \
+ -DGGML_BUILD_TESTS=OFF \
+ -DGGML_OPENMP=OFF \
+ -DBUILD_SHARED_LIBS=ON
+
+RUN cmake --build . --config Release -j $(nproc)
+
+FROM win-base AS win-arm64-builder
+
+ENV TOOLCHAIN_FILE=/src/ggml/build/toolchain-windows-arm64.cmake
+
+RUN echo "set(CMAKE_SYSTEM_NAME Windows)" > ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_C_COMPILER ${LLVM_MINGW_PATH}/bin/aarch64-w64-mingw32-clang)" >> ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_CXX_COMPILER ${LLVM_MINGW_PATH}/bin/aarch64-w64-mingw32-clang++)" >> ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_FIND_ROOT_PATH ${LLVM_MINGW_PATH}/aarch64-w64-mingw32)" >> ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)" >> ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)" >> ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)" >> ${TOOLCHAIN_FILE}
+
+RUN cmake .. \
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_FILE} \
+ -DBUILD_SHARED_LIBS=ON \
+ -DGGML_OPENMP=OFF \
+ -DGGML_BUILD_TESTS=OFF
+
+RUN cmake --build . --config Release -j $(nproc)
+
+FROM base AS linux-x64-builder
+
+RUN cmake .. \
+ -DBUILD_SHARED_LIBS=ON \
+ -DGGML_OPENMP=OFF \
+ -DGGML_BUILD_TESTS=OFF
+
+RUN cmake --build . --config Release -j $(nproc)
+
+FROM base AS linux-arm64-builder
+
+ENV TOOLCHAIN_FILE=/src/ggml/build/toolchain-linux-arm64.cmake
+
+RUN apt-get update && \
+ apt-get install -y g++-aarch64-linux-gnu
+
+RUN echo "set(CMAKE_SYSTEM_NAME Linux)" > ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_SYSTEM_PROCESSOR aarch64)" >> ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)" >> ${TOOLCHAIN_FILE} && \
+ echo "set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)" >> ${TOOLCHAIN_FILE}
+
+RUN cmake .. \
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_FILE} \
+ -DBUILD_SHARED_LIBS=ON \
+ -DGGML_BUILD_TESTS=OFF
+
+RUN cmake --build . --config Release -j $(nproc)
+
+FROM base
+
+WORKDIR /out
+
+ENV BASE=/src/ggml/build
+
+COPY --from=linux-x64-builder $BASE/src/*.so /out/runtimes/linux-x64/native/
+COPY --from=linux-arm64-builder $BASE/src/*.so /out/runtimes/linux-arm64/native/
+COPY --from=win-x64-builder $BASE/bin/*.dll /out/runtimes/win-x64/native/
+COPY --from=win-arm64-builder $BASE/bin/*.dll /out/runtimes/win-arm64/native/
\ No newline at end of file
diff --git a/GGMLSharp/build/build.sh b/GGMLSharp/build/build.sh
new file mode 100644
index 0000000..598c673
--- /dev/null
+++ b/GGMLSharp/build/build.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+set -e
+
+IMAGE_NAME="ggml-multi-platform-builder"
+OUTPUT_DIR="GGMLSharp/runtimes"
+
+if [ ! -d "ggml" ]; then
+ echo "Error: 'ggml' submodule directory not found."
+ echo "Please run this script from the root of your project."
+ exit 1
+fi
+
+GGML_COMMIT=$(git rev-parse HEAD:ggml)
+echo "Using ggml commit: ${GGML_COMMIT}"
+
+echo "Building the Docker image"
+docker build -t ${IMAGE_NAME} --network host -f GGMLSharp/build/Dockerfile --build-arg GGML_COMMIT=${GGML_COMMIT} .
+
+echo "Extracting the compiled runtimes"
+
+CONTAINER_ID=$(docker create ${IMAGE_NAME})
+
+if [ -d "${OUTPUT_DIR}" ]; then
+ echo "Removing existing output directory: ${OUTPUT_DIR}"
+ rm -rf "${OUTPUT_DIR}"
+fi
+mkdir -p "${OUTPUT_DIR}"
+
+docker cp "${CONTAINER_ID}:/out/runtimes/." "${OUTPUT_DIR}/"
+docker rm -v "${CONTAINER_ID}"
+
+echo "Done"
diff --git a/GGMLSharp/ggml.dll b/GGMLSharp/ggml.dll
deleted file mode 100644
index 8a6eea1..0000000
Binary files a/GGMLSharp/ggml.dll and /dev/null differ
diff --git a/GGMLSharp/runtimes/linux-arm64/native/libggml.so b/GGMLSharp/runtimes/linux-arm64/native/libggml.so
new file mode 100755
index 0000000..260f063
Binary files /dev/null and b/GGMLSharp/runtimes/linux-arm64/native/libggml.so differ
diff --git a/GGMLSharp/runtimes/linux-x64/native/libggml.so b/GGMLSharp/runtimes/linux-x64/native/libggml.so
new file mode 100755
index 0000000..94ca0a5
Binary files /dev/null and b/GGMLSharp/runtimes/linux-x64/native/libggml.so differ
diff --git a/GGMLSharp/runtimes/win-arm64/native/libggml.dll b/GGMLSharp/runtimes/win-arm64/native/libggml.dll
new file mode 100755
index 0000000..551f973
Binary files /dev/null and b/GGMLSharp/runtimes/win-arm64/native/libggml.dll differ
diff --git a/GGMLSharp/runtimes/win-x64/native/libggml.dll b/GGMLSharp/runtimes/win-x64/native/libggml.dll
new file mode 100755
index 0000000..779b3c2
Binary files /dev/null and b/GGMLSharp/runtimes/win-x64/native/libggml.dll differ
diff --git a/README.md b/README.md
index 1218688..912d6ce 100644
--- a/README.md
+++ b/README.md
@@ -52,3 +52,17 @@ GGMLSharp contains all ggml shared libs and some demos.
### Yolov3Tiny
[Yolov3Tiny](./Demos/Yolov3Tiny/) is a Demo shows how to implement YOLO object detection with ggml using pretrained model. The weight have been converted to gguf.
+
+## Library compilation
+
+Supported targets:
+- Win x64/arm64
+- Linux x64/arm64
+
+to compile the shared `ggml` libraries yourself, just run:
+
+```bash
+bash GGMLSharp/build/build.sh
+```
+
+from the root repo directory.
\ No newline at end of file