Repository: mavlink/MAVSDK
Pull request #2582 (2025-05-23 02:06:52)

More Windows fixes
And splitting the CI Windows build into mavsdk_server and library.

sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582)


sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582)


sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582)


sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582)


sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582)


sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582)


sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=mavlink_MAVSDK&pullRequest=2582&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=mavlink_MAVSDK&pullRequest=2582&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=mavlink_MAVSDK&pullRequest=2582)



Patch:
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
index 31cb7e93..b3ef0097 100644
--- a/.github/workflows/windows.yml
+++ b/.github/workflows/windows.yml
@@ -16,49 +16,110 @@ on:
     - '.github/workflows/docs_deploy.yml'
 
 jobs:
-  Windows:
-    name: Windows
+  Windows-mavsdk_server:
+    name: Windows mavsdk_server build
     runs-on: windows-latest
     steps:
       - uses: actions/checkout@v4
         with:
           submodules: recursive
+          fetch-depth: 0
+      - name: git get version tags
+        run: git fetch --tags
       - uses: actions/cache@v4
         id: cache
         with:
-          path: ./build/release/third_party/install
+          path: ./build/third_party/install
           key: ${{ github.job }}-${{ hashFiles('./third_party/**') }}
       - name: disable superbuild on cache hit
         if: steps.cache.outputs.cache-hit == 'true'
         run: |
             echo "superbuild=-DSUPERBUILD=OFF" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
-            echo "cmake_prefix_path=-DCMAKE_PREFIX_PATH=$(pwd)/build/release/third_party/install" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
-      - name: install packages
+            echo "cmake_prefix_path=-DCMAKE_PREFIX_PATH=$(pwd)/build/third_party/install" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
+      - name: install jom
         run: |
-            choco install nasm
-            echo "C:\Program Files\NASM" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
+          choco install jom
+          echo "C:\Program Files\jom" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
       - name: configure
-        run: cmake -G "Visual Studio 17 2022" $env:superbuild $env:cmake_prefix_path -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=build/release/install -DBUILD_MAVSDK_SERVER=ON -DBUILD_SHARED_LIBS=OFF -DWERROR=ON -Bbuild/release -S.
+        run: cmake -G"Visual Studio 17 2022"
+          $env:superbuild
+          $env:cmake_prefix_path
+          -DCMAKE_BUILD_TYPE=RelWithDebInfo
+          -DCMAKE_INSTALL_PREFIX=install
+          -DBUILD_MAVSDK_SERVER=ON
+          -DBUILD_SHARED_LIBS=OFF
+          -DWERROR=ON
+          -Bbuild
+          -S.
       - name: build
-        run: cmake --build build/release -j4 --config RelWithDebInfo --target install
-      - name: Create zip file mavsdk libraries
-        if: startsWith(github.ref, 'refs/tags/v')
-        run: cd build/release/install && 7z.exe a -tzip ../../../mavsdk-windows-x64-release.zip . && cd ../../..
-      - name: Publish mavsdk libraries
+        run: cmake --build build -j4 --config RelWithDebInfo --target install
+      - name: Upload mavsdk_server binary as artifact
+        uses: actions/upload-artifact@v4
+        with:
+          name: 'mavsdk_server-windows-x64-release'
+          path: 'install/bin/mavsdk_server_bin.exe'
+          retention-days: 2
+      - name: Publish mavsdk_server binary to release
         if: startsWith(github.ref, 'refs/tags/v')
         uses: svenstaro/upload-release-action@v1-release
         with:
           repo_token: ${{ secrets.GITHUB_TOKEN }}
-          file: 'mavsdk-windows-x64-release.zip'
-          asset_name: 'mavsdk-windows-x64-release.zip'
+          file: 'install/bin/mavsdk_server_bin.exe'
+          asset_name: 'mavsdk_server_win32.exe'
           tag: ${{ github.ref }}
           overwrite: true
-      - name: Publish mavsdk_server binary
+
+  Windows-mavsdk-library:
+    name: Windows mavsdk library build
+    runs-on: windows-latest
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          submodules: recursive
+          fetch-depth: 0
+      - name: git get version tags
+        run: git fetch --tags
+      - uses: actions/cache@v4
+        id: cache
+        with:
+          path: ./build/third_party/install
+          key: ${{ github.job }}-${{ hashFiles('./third_party/**') }}
+      - name: disable superbuild on cache hit
+        if: steps.cache.outputs.cache-hit == 'true'
+        run: |
+            echo "superbuild=-DSUPERBUILD=OFF" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
+            echo "cmake_prefix_path=-DCMAKE_PREFIX_PATH=$(pwd)/build/third_party/install" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
+      - name: install jom
+        run: |
+          choco install jom
+          echo "C:\Program Files\jom" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
+      - name: configure
+        run: cmake -G"Visual Studio 17 2022"
+          $env:superbuild
+          $env:cmake_prefix_path
+          -DCMAKE_BUILD_TYPE=RelWithDebInfo
+          -DCMAKE_INSTALL_PREFIX=install
+          -DBUILD_MAVSDK_SERVER=OFF
+          -DBUILD_SHARED_LIBS=ON
+          -DWERROR=ON
+          -Bbuild
+          -S.
+      - name: build
+        run: cmake --build build -j4 --config RelWithDebInfo --target install
+      - name: Create zip file from mavsdk libraries
+        run: (cd install && 7z.exe a -tzip ../mavsdk-windows-x64-release.zip .)
+      - name: Upload mavsdk library as artifact
+        uses: actions/upload-artifact@v4
+        with:
+          name: 'mavsdk-windows-x64-release'
+          path: 'install/'
+          retention-days: 2
+      - name: Publish mavsdk library to release
         if: startsWith(github.ref, 'refs/tags/v')
         uses: svenstaro/upload-release-action@v1-release
         with:
           repo_token: ${{ secrets.GITHUB_TOKEN }}
-          file: 'build/release/install/bin/mavsdk_server_bin.exe'
-          asset_name: 'mavsdk_server_win32.exe'
+          file: 'mavsdk-windows-x64-release.zip'
+          asset_name: 'mavsdk-windows-x64-release.zip'
           tag: ${{ github.ref }}
           overwrite: true
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 87beb8e8..2d2344bb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -52,6 +52,17 @@ HunterGate(
 
 project(mavsdk_superbuild)
 
+# FIXME: in the future we need to mark library methods that need to be visible manually
+#        and remove CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS.
+#        At the moment, we are running into the 65535 object limit on Windows likely because of this.
+if (BUILD_SHARED_LIBS AND MSVC AND BUILD_MAVSDK_SERVER)
+    message(FATAL_ERROR
+        "To build mavsdk_server on Windows, you need to use BUILD_SHARED_LIBS=OFF.\n"
+        "This avoids the Windows 65535 object limit when statically linking all dependencies.\n"
+        "Use: cmake -DBUILD_SHARED_LIBS=OFF ..."
+    )
+endif()
+
 if (BUILD_BACKEND)
     message(FATAL_ERROR "The argument BUILD_BACKEND has been replaced by BUILD_MAVSDK_SERVER. To build mavsdk_server, use -DBUILD_MAVSDK_SERVER=ON.")
 endif()
diff --git a/docs/en/SUMMARY.md b/docs/en/SUMMARY.md
index 4721a755..a542d5ce 100644
--- a/docs/en/SUMMARY.md
+++ b/docs/en/SUMMARY.md
@@ -19,8 +19,10 @@
         * [Logging](cpp/guide/logging.md)
         * [Plugin/Test Logging](cpp/guide/dev_logging.md)
         * [Testing](cpp/guide/test.md)
-        * [Building library from Source](cpp/guide/build.md)
-        * [Building mavsdk_server from Source](cpp/guide/build_mavsdk_server.md)
+        * [Build on Linux](cpp/guide/build_linux.md)
+        * [Building on macOS](cpp/guide/build.md)
+        * [Building on Windows](cpp/guide/build_windows.md)
+        * [Building using Dockcross](cpp/guide/build_dockcross.md)
         * [Generate API docs from Source](cpp/guide/build_docs.md)
         * [Coding Style](cpp/guide/code_style.md)
     * [Examples](cpp/examples/index.md)
diff --git a/docs/en/cpp/guide/build.md b/docs/en/cpp/guide/build.md
index 90e42fdd..9cadc0e3 100644
--- a/docs/en/cpp/guide/build.md
+++ b/docs/en/cpp/guide/build.md
@@ -1,219 +1,7 @@
-# Building MAVSDK Library from Source
+# Building MAVSDK from Source
 
-This section explains how to build and install the MAVSDK C++ library from source for all our target platforms.
-
-Note that there are separate instructions to [build the mavsdk_server](build_mavsdk_server.md).
-
-## Build the C++ Library {#build_mavsdk_cpp_library}
-
-This section explains how to build the library along with its unit and integration tests.
-
-### Requirements {#requirements}
-
-The build requirements are git, cmake, and a compiler such as GCC, Clang, or MSVC.
-
-#### Linux
-
-**Ubuntu**:
-```bash
-sudo apt-get update
-sudo apt-get install build-essential cmake git
-```
-
-**Fedora**:
-```bash
-sudo dnf update
-sudo dnf groupinstall "Development Tools" "Development Libraries"
-sudo dnf install cmake git
-```
-
-**Arch Linux**:
-```bash
-sudo pacman -Sy base-devel cmake git
-```
-
-#### macOS
-
-First install XCode Command line tools:
-```
-xcode-select --install
-```
-
-And [Homebrew](https://brew.sh/) (for cmake).
-Once you have installed brew, you can install `cmake` using `brew` in the terminal:
-```
-brew install cmake
-```
-
-#### Windows
-
-> Note: Building using Cygwin or MingW is not supported. Below are the instructions using MSVC.
-
-To build the library in Windows, you need:
-
-- [Build Tools for Visual Studio 2022](https://www.visualstudio.com/downloads/): Download and install (only the "Visual C+ Build Tools" are needed from installer).
-- [cmake](https://cmake.org/download/): Download the installer and run it.
-  Make sure to tick "add to PATH" during the installation.
-- [git](https://git-scm.com/download/win) or any other tool to work with git.
-- [perl](https://strawberryperl.com/) for OpenSSL unless building without CURL (see [Build without CURL](#build_without_curl)).
-
-> Note: Strawberry Linux installs all sorts of tools including cmake and adds them all to the system PATH. It is possible to prevent this by removing the paths `C:\Strawberry\c\bin` and `C:\Strawberry\perl\site\bin` and only leaving `C:\Strawberry\perl\bin`. (To edit Windows paths, go to System -> Advanced system settings -> Environment Variables and then edit the System variable `Path`.
-
-### Getting the source
-
-Download the source using git:
-```bash
-git clone https://github.com/mavlink/MAVSDK.git
-```
-
-Make sure to get all the submodules as well:
-```
-git submodule update --init --recursive
-```
-
-### Building Fundamentals
-
-Building the MAVSDK with CMake is broken down into two steps: **Configuration** and **Build**.
-
-#### Build Configuration Step {#configuration_step}
-For configuration, you specify the type of build you want to execute in the [build step](#build_step). You can checkout the [CMake Documentation on Build Configuration](https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#build-configurations) for more context.
-
-A typical configuration command example would be:
-
-`cmake -DCMAKE_BUILD_TYPE=Debug -Bbuild/default -S.`
-
-- Build type is set to `Debug`
-- Build directory is set to `build/default`
-- Chose the directory using the `H.` flag
-
-During the configure step you can set more flags using `-DFLAG=Value`:
-
-- `CMAKE_BUILD_TYPE`: as documented above, to chose between `Debug` and `Release` build.
-- `CMAKE_INSTALL_PREFIX`: as documented above, to specify directory to install library artifacts.
-- `BUILD_SHARED_LIBS`: set to `ON` to build dynamic libraries (such as .so on Linux, .dylib on macOS, .dll on Windows). Set to `OFF` to build static libraries (such as .a on Linux and macOS, .lib on Windows).
-- `SUPERBUILD`: set to `OFF` to use system dependencies instead of [third party dependencies](https://github.com/mavlink/MAVSDK/tree/main/third_party) downloaded and built using cmake.
-- `CMAKE_PREFIX_PATH`: can be used to set the path where the dependencies can be found if `SUPERBUILD` is set to `OFF`.
-- `BUILD_MAVSDK_SERVER`: set to `ON` to build mavsdk_server, see instruction to [build mavsdk_server](build_mavsdk_server.md).
-- `BUILD_WITHOUT_CURL`: set to `OFF` by default (check [Build without CURL](#build_without_curl).
-- `ASAN`: set to `ON` to enable address sanitizer.
-- `UBSAN`: set to `ON` to enable undefined behavior sanitizer.
-- `LSAN`: set to `ON` to enable leak sanitizer.
-- `WERROR`: set to `ON` to error on warnings, mostly used for CI.
-
-After the configuration step, everything that will be build in the [build step](#build_step) have been specified, and if you want to change your build configuration (e.g. If you want to build `Debug` build instead of `Release` build), you must execute the [configuration step](#configuration_step) again!
-
-#### Build Step {#build_step}
-In the build step, we finally build the library and binaries and link them.
-
-The stripped down version of the build command would be:
-
-`cmake --build build/default`
-
-- The `--build` signals the CMake to execute the build
-- It uses the build configuration built from the [configuration step](#configuration_step), located at `build/default` folder
-
-Additionally, you can install it in the system with the `--target install` command added as well, which is explained in detail in the [Installing the C++ Library](#install_mavsdk_cpp_library) section below.
-
-### Building
-
-#### Debug
-
-To build the MAVSDK C++ Library for development, use the debug build.
-
-There are 2 steps in building a library: Configure and build.
-```bash
-cmake -DCMAKE_BUILD_TYPE=Debug -Bbuild/default -S.
-cmake --build build/default -j8
-```
-
-####  Release
-
-Once you ship software, make sure to use the release build with optimizations turned on:
-
-**Linux/macOS:**
-
- ```bash
- cmake -Bbuild/default -DCMAKE_BUILD_TYPE=Release -S.
- cmake --build build/default -j8
- ```
-
-**Windows:**
-
-```bash
-cmake -Bbuild/default -S. -DCMAKE_BUILD_TYPE=Release
-cmake --build build/default -j8 --config Release
-```
-
-> Note: It is not usual to use CMAKE_BUILD_TYPE on Windows (with MSVC), however, our build requires it for the dependencies which are built at configure time.
-
-## Installing the C++ Library {#install_mavsdk_cpp_library}
-
-*Installing* builds the SDK **and** copies the libraries and header files into a "public" location so that they can be referenced by C++ applications (see [Building C++ Apps](../guide/toolchain.md)).
-
-
-### System-wide Install {#sdk_system_wide_install}
-
-You can configure to install system wide by not setting the `CMAKE_INSTALL_PREFIX` in the [configuration step](#configuration_step), since CMake tries to install system wide by default. For Linux/macOS that's `/usr/local`, for Windows it is somewhere in `C:\Program Files`.
-
-To install system-wide the command needs to be run with sudo on Linux/macOS:
-
-```bash
-sudo cmake --build build/default --target install
-```
-
-or run in a command prompt with admin privileges on Windows, or using `runas`:
-
-```bash
-runas cmake --build build/default --target install
-```
-
-::: warning
-Make sure to prevent conflicts between libraries installed in your system.
-The mavsdk library installed via a .deb or .rpm file will be installed in `/usr/` while the built library will be installed in `/usr/local`.
-It's recommended to only have one installed at any time to prevent conflicts.
-:::
-
-### Local Install {#sdk_local_install}
-
-The install path can be set in the [configuration step](#configuration_step) using `CMAKE_INSTALL_PREFIX`:
-
-For example, to install into the `MAVSDK/install/` folder you would set the `CMAKE_INSTALL_PREFIX` variable to specify a path relative to the folder from which you call `cmake` (or an absolute path).
-```bash
-cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -Bbuild/default -S.
-cmake --build build/default --target install
-```
-
-::: tip
-If you already have run *cmake* without setting `CMAKE_INSTALL_PREFIX`, you may need to clean the build first:
-
-```sh
-rm -rf build/default
-```
-:::
-
-## Troubleshooting
-
-### Git submodules out of date
-
-Some common build issues can be resolved by updating submodules and cleaning the distribution:
-```
-cd MAVSDK
-git submodule update --recursive
-rm -rf build
-```
-
-Then attempt to build again.
-
-### MSVC vs. MingW
-
-We only try to support building using MSVC, MingW is not working, mostly because the defines/flags for it are missing.
-
-### Undefined reference to mavsdk...
-
-If you only just built the library and installed it system-wide may also need to [update the linker cache](http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html).
-
-On Linux this is done with `sudo ldconfig`.
-
-### Build without CURL (#build_without_curl)
-
-If you don't need http/https downloads for camera definition files or other component definition files (because you are using MAVLink FTP for these), and you don't build the MAVSDK server (`BUILD_MAVSDK_SERVER=OFF`), you can exclude CURL and OpenSSL using `-DBUILD_WITHOUT_CURL=ON`.
+This topic has been split into:
+- [Build on Linux](build_linux.md)
+- [Build on macOS](build_macos.md)
+- [Build on Windows](build_windows.md)
+- [Build with dockcross](build_dockcross.md) (for cross compilation and Android)
diff --git a/docs/en/cpp/guide/build_dockcross.md b/docs/en/cpp/guide/build_dockcross.md
new file mode 100644
index 00000000..7a8ffe51
--- /dev/null
+++ b/docs/en/cpp/guide/build_dockcross.md
@@ -0,0 +1,119 @@
+# Cross-compilation with Dockcross and Android Builds
+
+This guide explains how to build MAVSDK using dockcross for cross-compilation and how to build for Android.
+
+## Building with Dockcross
+
+[Dockcross](https://github.com/dockcross/dockcross) is a cross-compiling toolchain that can be used to build MAVSDK for various platforms.
+
+### Requirements
+
+- Docker installed and running
+- Git
+
+### Getting Started with Dockcross
+
+1. Clone the MAVSDK repository:
+```bash
+git clone https://github.com/mavlink/MAVSDK.git
+cd MAVSDK
+git submodule update --init --recursive
+```
+
+2. Pull and run the appropriate dockcross image for your target platform
+3. Use the generated dockcross script to run your build commands
+
+### Example: Cross-compiling for ARM
+
+```bash
+# Get the dockcross script for ARM
+docker run --rm dockcross/linux-armv7 > ./dockcross-linux-armv7
+chmod +x ./dockcross-linux-armv7
+
+# Use the script to run cmake and build
+./dockcross-linux-armv7 bash -c 'cmake -DCMAKE_BUILD_TYPE=Release -Bbuild -S. && cmake --build build'
+```
+
+## Building for Android
+
+### Requirements
+
+- Android NDK
+- CMake
+- Git
+- Java Development Kit (JDK)
+
+### Setup Android NDK
+
+1. Download and install [Android Studio](https://developer.android.com/studio)
+2. Install the NDK and CMake through Android Studio's SDK Manager:
+   - Open Android Studio
+   - Go to Tools -> SDK Manager
+   - Select SDK Tools tab
+   - Check "NDK (Side by side)" and "CMake"
+   - Click Apply to download and install
+
+### Building
+
+1. Clone the repository:
+```bash
+git clone https://github.com/mavlink/MAVSDK.git
+cd MAVSDK
+git submodule update --init --recursive
+```
+
+2. Set up environment variables:
+```bash
+export ANDROID_NDK_HOME=/path/to/android/ndk
+export ANDROID_CMAKE=/path/to/android/cmake
+```
+
+3. Configure and build for your target Android architecture:
+```bash
+cmake \
+    -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \
+    -DANDROID_ABI=arm64-v8a \
+    -DANDROID_PLATFORM=android-28 \
+    -DCMAKE_BUILD_TYPE=Release \
+    -Bbuild/android \
+    -S.
+
+cmake --build build/android
+```
+
+### Android Build Options
+
+- `ANDROID_ABI`: Specify the target architecture
+  - `armeabi-v7a`: ARMv7 devices
+  - `arm64-v8a`: ARMv8 64-bit devices
+  - `x86`: x86 devices
+  - `x86_64`: x86 64-bit devices
+
+- `ANDROID_PLATFORM`: Minimum Android API level
+  - Example: `android-28` for Android 9.0 (Pie)
+
+### Additional Build Flags
+
+The same build flags available for regular builds can be used:
+
+- `BUILD_SHARED_LIBS`: Set to `ON` for shared libraries (.so)
+- `SUPERBUILD`: Set to `OFF` to use system dependencies
+- `BUILD_MAVSDK_SERVER`: Set to `ON` to build mavsdk_server
+- `BUILD_WITHOUT_CURL`: Set to `ON` to build without CURL support
+
+## Troubleshooting
+
+### Git Submodules Out of Date
+
+If you encounter build issues, try updating the submodules:
+```bash
+git submodule update --recursive
+rm -rf build
+```
+
+### Android NDK Version Issues
+
+If you encounter issues with the NDK version:
+1. Make sure you're using a compatible NDK version
+2. Update your Android Studio and NDK to the latest stable versions
+3. Verify that `ANDROID_NDK_HOME` points to the correct NDK version 
\ No newline at end of file
diff --git a/docs/en/cpp/guide/build_linux.md b/docs/en/cpp/guide/build_linux.md
new file mode 100644
index 00000000..fd14b374
--- /dev/null
+++ b/docs/en/cpp/guide/build_linux.md
@@ -0,0 +1,116 @@
+# Building MAVSDK on Linux
+
+This guide explains how to build MAVSDK from source on Linux systems.
+
+## Requirements
+
+The build requirements are git, cmake, and a C++ compiler (GCC or Clang).
+
+### Ubuntu
+```bash
+sudo apt-get update
+sudo apt-get install build-essential cmake git
+```
+
+### Fedora
+```bash
+sudo dnf update
+sudo dnf groupinstall "Development Tools" "Development Libraries"
+sudo dnf install cmake git
+```
+
+## Getting the Source
+
+Download the source using git:
+```bash
+git clone https://github.com/mavlink/MAVSDK.git
+cd MAVSDK
+git submodule update --init --recursive
+```
+
+## Building the MAVSDK library on Linux
+
+### Debug Build
+
+For development, use the debug build:
+```bash
+cmake -DCMAKE_BUILD_TYPE=Debug -Bbuild -S.
+cmake --build build -j8
+```
+
+### Release Build
+
+For production use, build with optimizations enabled:
+```bash
+cmake -DCMAKE_BUILD_TYPE=Release -Bbuild -S.
+cmake --build build -j8
+```
+
+## Installation
+
+### System-wide Installation
+
+To install system-wide in `/usr/local`:
+```bash
+sudo cmake --build build --target install
+sudo ldconfig  # Update linker cache
+```
+
+### Local Installation
+
+To install to a custom location, e.g. `install`
+
+```bash
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -Bbuild -S.
+cmake --build build --target install
+```
+
+## Build mavsdk_server binary on Linux
+
+Language wrappers for MAVSDK other than C++ connect to the MAVSDK C++ core using gRPC. This gRPC server around the MAVSDK C++ library is called mavsdk_server (in the past it was referred to as the backend).
+
+For more information about the architecture, also see [how the auto-generation works](../contributing/autogen.md).
+
+In order to include the mavsdk_server in the build, add `-DBUILD_MAVSDK_SERVER=ON`:
+
+```bash
+cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MAVSDK_SERVER=ON -Bbuild -S.
+cmake --build build -j8
+```
+
+## Build Options
+
+During the configure step you can set various flags using `-DFLAG=Value`:
+
+- `CMAKE_BUILD_TYPE`: Choose between `Debug`, `Release`, or `RelWithDebInfo` (optimizations and debug symbols)
+- `CMAKE_INSTALL_PREFIX`: Specify directory to install library artifacts
+- `BUILD_SHARED_LIBS`: Set to `ON` for dynamic libraries (.so), `OFF` for static libraries (.a)
+- `SUPERBUILD`: Set to `OFF` to use system dependencies instead of third party dependencies
+- `CMAKE_PREFIX_PATH`: Set path where dependencies can be found if `SUPERBUILD` is `OFF`
+- `BUILD_MAVSDK_SERVER`: Set to `ON` to build mavsdk_server
+- `BUILD_WITHOUT_CURL`: Set to `ON` to build without CURL support
+- `ASAN`: Set to `ON` to enable address sanitizer
+- `UBSAN`: Set to `ON` to enable undefined behavior sanitizer
+- `LSAN`: Set to `ON` to enable leak sanitizer
+- `WERROR`: Set to `ON` to treat warnings as errors
+
+## Troubleshooting
+
+### Git Submodules Out of Date
+
+If you encounter build issues, try updating the submodules:
+```bash
+git submodule update --recursive
+```
+
+### Undefined References
+
+If you get undefined reference errors after installation, update the linker cache:
+```bash
+sudo ldconfig
+``` 
+
+And try a clean build by wiping the build directory:
+```bash
+rm -r build
+```
diff --git a/docs/en/cpp/guide/build_macos.md b/docs/en/cpp/guide/build_macos.md
new file mode 100644
index 00000000..5d03476a
--- /dev/null
+++ b/docs/en/cpp/guide/build_macos.md
@@ -0,0 +1,107 @@
+# Building MAVSDK on macOS
+
+This guide explains how to build MAVSDK from source on macOS systems.
+
+## Requirements
+
+The build requirements are:
+- XCode Command Line Tools
+- CMake
+- Git
+
+### Install Build Tools
+
+First install XCode Command line tools:
+```bash
+xcode-select --install
+```
+
+Then install [Homebrew](https://brew.sh/) and use it to install CMake:
+```bash
+/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
+brew install cmake
+```
+
+## Getting the Source
+
+Download the source using git:
+```bash
+git clone https://github.com/mavlink/MAVSDK.git
+cd MAVSDK
+git submodule update --init --recursive
+```
+
+## Building the MAVSDK library on macOS
+
+### Debug Build
+
+For development, use the debug build:
+```bash
+cmake -DCMAKE_BUILD_TYPE=Debug -Bbuild -S.
+cmake --build build -j8
+```
+
+### Release Build
+
+For production use, build with optimizations enabled:
+```bash
+cmake -DCMAKE_BUILD_TYPE=Release -Bbuild -S.
+cmake --build build -j8
+```
+
+## Installation
+
+### System-wide Installation
+
+To install system-wide in `/usr/local`:
+```bash
+sudo cmake --build build --target install
+```
+
+### Local Installation
+
+To install to a local folder, e.g. `install`:
+```bash
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -Bbuild -S.
+cmake --build build --target install
+```
+
+## Build for iOS {#build_cpp_iOS}
+
+To build for real iOS devices on macOS:
+
+```bash
+cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MAVSDK_SERVER=ON -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=tools/ios.toolchain.cmake -DPLATFORM=OS -Bbuild/ios -S.
+cmake --build build/ios
+```
+
+Build for the iOS simulator on macOS:
+
+```bash
+cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MAVSDK_SERVER=ON -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=tools/ios.toolchain.cmake -DPLATFORM=SIMULATOR64 -Bbuild/ios_simulator -S.
+```
+
+## Build Options
+
+During the configure step you can set various flags using `-DFLAG=Value`:
+
+- `CMAKE_BUILD_TYPE`: Choose between `Debug` and `Release` build
+- `CMAKE_INSTALL_PREFIX`: Specify directory to install library artifacts
+- `BUILD_SHARED_LIBS`: Set to `ON` for dynamic libraries (.dylib), `OFF` for static libraries (.a)
+- `SUPERBUILD`: Set to `OFF` to use system dependencies instead of third party dependencies
+- `CMAKE_PREFIX_PATH`: Set path where dependencies can be found if `SUPERBUILD` is `OFF`
+- `BUILD_MAVSDK_SERVER`: Set to `ON` to build mavsdk_server
+- `BUILD_WITHOUT_CURL`: Set to `ON` to build without CURL support
+- `ASAN`: Set to `ON` to enable address sanitizer
+- `UBSAN`: Set to `ON` to enable undefined behavior sanitizer
+- `LSAN`: Set to `ON` to enable leak sanitizer
+- `WERROR`: Set to `ON` to treat warnings as errors
+
+## Troubleshooting
+
+### Git Submodules Out of Date
+
+If you encounter build issues, try updating the submodules:
+```bash
+git submodule update --recursive
+``` 
\ No newline at end of file
diff --git a/docs/en/cpp/guide/build_mavsdk_server.md b/docs/en/cpp/guide/build_mavsdk_server.md
index e29dedb1..12b39f3a 100644
--- a/docs/en/cpp/guide/build_mavsdk_server.md
+++ b/docs/en/cpp/guide/build_mavsdk_server.md
@@ -8,75 +8,9 @@ For more information about the architecture, also see [how the auto-generation w
 It is generally recommended to use pre-built binaries of mavsdk_server from the [releases page](https://github.com/mavlink/MAVSDK/releases), however, if needed, it can also be built manually from source as described below.
 :::
 
-## Requirements
 
-The requirements are the same as described in the [library build instructions](build.md#requirements)
-
-## Build on Linux
-
-```
-cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_MAVSDK_SERVER=ON -Bbuild/default -S.
-cmake --build build/default -j8
-```
-
-## Build on macOS
-
-```
-cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_MAVSDK_SERVER=ON -Bbuild/default -S.
-cmake --build build/default -j8
-```
-
-## Build on Windows
-
-Open the "x64 Native Tools Command Prompt for VS 2022" (or later), cd into the MAVSDK directory, and do:
-
-```
-cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MAVSDK_SERVER=ON -Bbuild/default -S.
-cmake --build build/default -j8
-```
-
-## Build for Android {#build_cpp_android}
-
-Build for Android using the dockcross cross compiler, as described in the [cross-compilation](#cross_compilation_dockcross) section below (e.g. with the `dockcross/android-arm64` image).
-
-## Build for iOS {#build_cpp_iOS}
-
-To build for real iOS devices on macOS:
-
-```sh
-cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MAVSDK_SERVER=ON -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=tools/ios.toolchain.cmake -DPLATFORM=OS -Bbuild/ios -S.
-cmake --build build/ios
-```
-
-Build for the iOS simulator on macOS:
-
-```sh
-cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MAVSDK_SERVER=ON -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=tools/ios.toolchain.cmake -DPLATFORM=SIMULATOR64 -Bbuild/ios_simulator -S.
-```
-
-## Cross compilation using dockcross {#cross_compilation_dockcross}
-
-Cross compilation is usually the fastest way to compile for "embedded" platforms like the Raspberry Pi, or Nvidia Jetson (i.e. typically faster than native compilation on device itself).
-
-We recommend using [dockcross](https://github.com/dockcross/dockcross), which is a very convenient tool for cross compilation based on docker (and which supports many platforms).
-
-For example, use the commands below to build for `armv7`:
-
-1. Make sure docker is installed on your system.
-2. Navigate into the SDK directory, and use the commands below:
-   ```
-   cd MAVSDK
-   docker run --rm dockcross/linux-armv7 > ./dockcross-linux-armv7
-   chmod +x ./dockcross-linux-armv7
-   ./dockcross-linux-armv7 cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MAVSDK_SERVER=ON -DBUILD_SHARED_LIBS=OFF -Bbuild/linux-armv7 -S.
-   ./dockcross-linux-armv7 cmake --build build/linux-armv7 -j 8
-   ```
-3. If all goes well, `mavsdk_server` is built. You can check the file with:
-   ```
-   ./dockcross-linux-armv7 file build/linux-armv7-release/src/backend/src/mavsdk_server
-   build/linux-armv7-release/src/backend/src/mavsdk_server: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 4.10.8, not stripped
-   ```
-4. The newly built binary can now be copied to the device:
-   ```
-   cp build/linux-armv7/src/backend/src/mavsdk_server somewhere/else
-   ```
+This topic has been split into:
+- [Build on Linux](build_linux.md)
+- [Build on macOS](build_macos.md)
+- [Build on Windows](build_windows.md)
+- [Build with dockcross](build_dockcross.md) (for cross compilation and Android)
diff --git a/docs/en/cpp/guide/build_windows.md b/docs/en/cpp/guide/build_windows.md
new file mode 100644
index 00000000..ca55f2d5
--- /dev/null
+++ b/docs/en/cpp/guide/build_windows.md
@@ -0,0 +1,159 @@
+# Building MAVSDK on Windows
+
+This guide explains how to build MAVSDK from source on Windows systems.
+
+::: warning
+Building using Cygwin or MinGW is not supported. These instructions are for building with MSVC (Microsoft Visual C++).
+:::
+
+## Requirements
+
+The build requirements are:
+- Build Tools for Visual Studio 2022 (including Ninja)
+- CMake
+- Git
+- Perl (for OpenSSL unless building without CURL)
+- jom (optional) to parallelize the OpenSSL build
+
+### Install Build Tools
+
+1. Install [Build Tools for Visual Studio 2022](https://www.visualstudio.com/downloads/)
+   - Only the "Visual C++ Build Tools" are needed from the installer
+   
+2. Install [CMake](https://cmake.org/download/)
+   - Download and run the installer
+   - Make sure to tick "add to PATH" during installation
+
+3. Install [Git](https://git-scm.com/download/win)
+   - Choose any Git client you prefer
+
+4. Install [Strawberry Perl](https://strawberryperl.com/) (required for OpenSSL unless building without CURL and not mavsdk_server):
+   - After installation, you may want to modify the PATH to only include the Perl binary path, otherwise it will pick up cmake and libraries from the Strawberry Perl installation.
+   - To edit Windows paths:
+     1. Go to System -> Advanced system settings -> Environment Variables
+     2. Edit the System variable `Path`
+     3. Remove `C:\Strawberry\c\bin` and `C:\Strawberry\perl\site\bin`
+     4. Keep only `C:\Strawberry\perl\bin`
+
+5. (Optional) Install [jom](https://download.qt.io/official_releases/jom/) and add it to the path.
+
+## Getting the Source
+
+Download the source using git:
+```bash
+git clone https://github.com/mavlink/MAVSDK.git
+cd MAVSDK
+git submodule update --init --recursive
+```
+
+## Building the MAVSDK library only
+
+### Debug Build
+
+For development, use the debug build:
+```bash
+cmake -GNinja -DCMAKE_BUILD_TYPE=Debug -Bbuild -S.
+cmake --build build --config Debug
+```
+
+### Release Build
+
+For production use, build with optimizations enabled:
+
+```bash
+cmake -GNinja -DCMAKE_BUILD_TYPE=Release -S. -Bbuild
+cmake --build build --config Release
+```
+
+::: tip
+It is not usual to use CMAKE_BUILD_TYPE on Windows (with MSVC), however, our build requires it for the dependencies which are built at configure time.
+:::
+
+### Shared vs. static library build
+
+There are (at least) two ways to build the MAVSDK library:
+- As a shared library (.dll) including all dependencies statically.
+- As a static library (.lib) **not** including the dependencies.
+
+By default a shared library (.dll) is built which is easier to handle because it can be used standalone.
+
+If a static library needs to be built, this can be done using `-DCMAKE_BUILD_SHARED_LIBS=ON`.
+Note that a `mavsdk.lib` built this way does not "contain" the dependencies it was built with, so the CMAKE_PREFIX_PATH used to build the library needs to be passed to any binary which is built on top of it.
+
+For instance, to build the examples, it looks like this:
+
+```bash
+cmake -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=install -DBUILD_MAVSDK_SERVER=ON -DBUILD_SHARED_LIBS=OFF -DWERROR=ON -Bbuild -S.
+cmake --build build --config RelWithDebInfo --target install
+```
+
+And now the examples need both dependencies: mavsdk.lib but also its transitive dependencies:
+
+```bash
+cd examples
+cmake -G"Ninja" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_PREFIX_PATH="../install;../build/third_party/install" -DCMAKE_INSTALL_PREFIX=install -Bbuild -S.
+cmake --build build
+```
+
+## Installation
+
+### System-wide Installation
+
+To install system-wide (requires admin privileges):
+```bash
+# Run in command prompt with admin privileges
+cmake --build build --target install
+```
+
+### Local Installation
+
+To install to a custom location:
+```bash
+cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -Bbuild -S.
+cmake --build build --target install
+```
+
+## Build mavsdk_server binary on Windows
+
+Language wrappers for MAVSDK other than C++ connect to the MAVSDK C++ core using gRPC. This gRPC server around the MAVSDK C++ library is called mavsdk_server (in the past it was referred to as the backend).
+
+For more information about the architecture, also see [how the auto-generation works](../contributing/autogen.md).
+
+In order to include the mavsdk_server in the build, add `-DBUILD_MAVSDK_SERVER=ON`. In order to avoid a linking issue on Windows (where more than 65535 objects are present, we need to build all static libraries like so:
+
+```bash
+cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_MAVSDK_SERVER=ON -Bbuild -S.
+cmake --build build
+```
+
+## Build Options
+
+During the configure step you can set various flags using `-DFLAG=Value`:
+
+- `CMAKE_BUILD_TYPE`: Choose between `Debug`, `Release`, or `RelWithDebInfo` build.
+- `CMAKE_INSTALL_PREFIX`: Specify directory to install library artifacts
+- `BUILD_SHARED_LIBS`: Set to `ON` for dynamic libraries (.dll), `OFF` for static libraries (.lib)
+- `SUPERBUILD`: Set to `OFF` to use system dependencies instead of third party dependencies
+- `CMAKE_PREFIX_PATH`: Set path where dependencies can be found if `SUPERBUILD` is `OFF`
+- `BUILD_MAVSDK_SERVER`: Set to `ON` to build mavsdk_server
+- `BUILD_WITHOUT_CURL`: Set to `ON` to build without CURL support (avoids OpenSSL/Perl requirement)
+- `WERROR`: Set to `ON` to treat warnings as errors
+
+## Troubleshooting
+
+### Git Submodules Out of Date
+
+If you encounter build issues, try updating the submodules:
+```bash
+git submodule update --recursive
+rm -rf build
+```
+
+### Build Without CURL
+
+If you don't need http/https downloads for camera definition files or other component definition files, and you're not building the MAVSDK server (`BUILD_MAVSDK_SERVER=OFF`), you can exclude CURL and OpenSSL using:
+```bash
+cmake -GNinja -DBUILD_WITHOUT_CURL=ON -Bbuild -S.
+```
+
+This eliminates the need for Perl/OpenSSL setup. 
\ No newline at end of file
diff --git a/docs/en/cpp/guide/toolchain.md b/docs/en/cpp/guide/toolchain.md
index 03f1a13a..9d3caf53 100644
--- a/docs/en/cpp/guide/toolchain.md
+++ b/docs/en/cpp/guide/toolchain.md
@@ -14,7 +14,7 @@ Below we explain how to set up a minimal build setup (**CMakeLists.txt**) file f
 
 *Cmake* uses a definition file named **CMakeLists.txt** to define the project. This specifies the name of the project, compiler flags for different platforms and targets, where to find dependencies (libraries and header files), source files to build, and the name of the generated binary. **CMakeLists.txt** is typically stored in the root directory of your app project.
 
-The sections below show how you can set up the file for when the SDK is [installed system wide](installation.md) (the default) or [locally](build.md#sdk_local_install).
+The sections below show how you can set up the file for when the SDK is [installed system wide](installation.md) (the default) or [locally](build.md).
 
 ::: warning
 On Windows use the [local installation](#sdk_local_install).
@@ -93,6 +93,11 @@ cmake -Bbuild -DCMAKE_PREFIX_PATH=../mavsdk -H.
 cmake --build build -j8
 ```
 
+::: tip
+When you run and ship your exe, you need to include the mavsdk.dll and have it either somewhere in the path, or in the same folder, so next to your exe.
+Otherwise you get a "System Error: The code execution cannot proceed because mavsdk.dll was not found. Reinstalling the program may fix this problem" when you try to run it.
+:::
+
 ## Run the App
 
 To Execute the file (in your build directory):
diff --git a/third_party/absl/CMakeLists.txt b/third_party/absl/CMakeLists.txt
index c472a65b..d26de3d8 100644
--- a/third_party/absl/CMakeLists.txt
+++ b/third_party/absl/CMakeLists.txt
@@ -13,6 +13,7 @@ list(APPEND CMAKE_ARGS
     "-DBUILD_TESTING=OFF"
     "-DABSL_BUILD_TESTING=OFF"
     "-DABSL_PROPAGATE_CXX_STD=ON"
+    "-DBUILD_SHARED_LIBS=OFF"
     )
 
 if(IOS)
diff --git a/third_party/cares/CMakeLists.txt b/third_party/cares/CMakeLists.txt
index 4c32e03e..b083ae35 100644
--- a/third_party/cares/CMakeLists.txt
+++ b/third_party/cares/CMakeLists.txt
@@ -12,6 +12,7 @@ list(APPEND CMAKE_ARGS
     "-DCARES_SHARED=OFF"
     "-DCARES_STATIC_PIC=ON"
     "-DCARES_BUILD_TOOLS=OFF"
+    "-DBUILD_SHARED_LIBS=OFF"
     )
 
 if(IOS)
diff --git a/third_party/cpptrace/CMakeLists.txt b/third_party/cpptrace/CMakeLists.txt
index dbb5e036..01a1ea6f 100644
--- a/third_party/cpptrace/CMakeLists.txt
+++ b/third_party/cpptrace/CMakeLists.txt
@@ -10,6 +10,7 @@ list(APPEND CMAKE_ARGS
     "-DCMAKE_POSITION_INDEPENDENT_CODE=ON"
     "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
     "-DCMAKE_CXX_STANDARD=17"
+    "-DBUILD_SHARED_LIBS=OFF"
     )
 
 message(STATUS "Preparing external project \"cpptrace\" with args:")
diff --git a/third_party/grpc/CMakeLists.txt b/third_party/grpc/CMakeLists.txt
index bc26bad1..6e5889f4 100644
--- a/third_party/grpc/CMakeLists.txt
+++ b/third_party/grpc/CMakeLists.txt
@@ -10,6 +10,7 @@ list(APPEND CMAKE_ARGS
     "-DCMAKE_POSITION_INDEPENDENT_CODE=ON"
     "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
     "-DCMAKE_CXX_STANDARD=17"
+    "-DBUILD_SHARED_LIBS=OFF"
     "-DRUN_HAVE_STD_REGEX=0"
     "-DRUN_HAVE_POSIX_REGEX=0"
     "-DRUN_HAVE_STEADY_CLOCK=0"
diff --git a/third_party/openssl/CMakeLists.txt b/third_party/openssl/CMakeLists.txt
index e68beb83..07f510d6 100644
--- a/third_party/openssl/CMakeLists.txt
+++ b/third_party/openssl/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.22.1)
 
 project(external-openssl)
 include(ExternalProject)
@@ -46,8 +46,8 @@ if(ANDROID)
         PREFIX openssl
         PATCH_COMMAND patch -p 0 < ${PROJECT_SOURCE_DIR}/dockcross-android.patch
         CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env ANDROID_NDK=$ENV{CROSS_ROOT} <SOURCE_DIR>/Configure --sysroot=$ENV{CROSS_ROOT}/sysroot ${OPENSSL_PLATFORM} --prefix=${CMAKE_INSTALL_PREFIX} ${OPENSSL_BUILD_TYPE} no-asm no-shared
-        BUILD_COMMAND make -j${BUILD_PARALLEL_JOBS}
-        INSTALL_COMMAND make install_sw
+        BUILD_COMMAND make -j${BUILD_PARALLEL_JOBS} build_libs
+        INSTALL_COMMAND make install_dev
         )
 
 elseif(IOS)
@@ -67,7 +67,7 @@ elseif(IOS)
         openssl
         URL https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
         PREFIX openssl
-        CONFIGURE_COMMAND <SOURCE_DIR>/Configure ${OPENSSL_PLATFORM} --prefix=${CMAKE_INSTALL_PREFIX} ${OPENSSL_BUILD_TYPE} no-shared
+        CONFIGURE_COMMAND <SOURCE_DIR>/Configure ${OPENSSL_PLATFORM} --prefix=${CMAKE_INSTALL_PREFIX} ${OPENSSL_BUILD_TYPE} no-shared no-tests
         )
 
 elseif(CMAKE_CROSSCOMPILING) # This assumes we use dockcross
@@ -85,26 +85,44 @@ elseif(CMAKE_CROSSCOMPILING) # This assumes we use dockcross
         openssl
         URL https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
         PREFIX openssl
-        CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env CROSS_COMPILE="" <SOURCE_DIR>/Configure ${OPENSSL_PLATFORM} --prefix=${CMAKE_INSTALL_PREFIX} ${OPENSSL_BUILD_TYPE} no-shared
-        BUILD_COMMAND make -j${BUILD_PARALLEL_JOBS}
-        INSTALL_COMMAND make install_sw
+        CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env CROSS_COMPILE="" <SOURCE_DIR>/Configure ${OPENSSL_PLATFORM} --prefix=${CMAKE_INSTALL_PREFIX} ${OPENSSL_BUILD_TYPE} no-shared no-tests
+        BUILD_COMMAND make -j${BUILD_PARALLEL_JOBS} build_libs
+        INSTALL_COMMAND make install_dev
         )
 
 elseif(MSVC)
     message("CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
-    # Only available from cmake 3.20, for now do it manually.
-    #cmake_path(NATIVE_PATH CMAKE_INSTALL_PREFIX NORMALIZE NATIVE_INSTALL_PREFIX)
-    string(REPLACE "/" "\\" NATIVE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
+    cmake_path(NATIVE_PATH CMAKE_INSTALL_PREFIX NORMALIZE NATIVE_INSTALL_PREFIX)
     message("NATIVE_INSTALL_PREFIX: ${NATIVE_INSTALL_PREFIX}")
 
-    ExternalProject_add(
-        openssl
-        URL https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
-        PREFIX openssl
-        CONFIGURE_COMMAND perl <SOURCE_DIR>/Configure VC-WIN64A --prefix=${NATIVE_INSTALL_PREFIX} --openssldir=${NATIVE_INSTALL_PREFIX} ${OPENSSL_BUILD_TYPE} no-shared no-asm
-        BUILD_COMMAND set MAKEFLAGS= && set CL=/MP && nmake
-        INSTALL_COMMAND set MAKEFLAGS= && nmake install_sw
+    find_program(JOM_EXECUTABLE
+        NAMES jom jom.exe
+        DOC "Path to jom executable"
+    )
+
+    if(JOM_EXECUTABLE)
+        message(STATUS "Using jom for OpenSSL parallel build")
+        # Parallel build of openssl is not supported unless you use jom.
+        # See: https://github.com/openssl/openssl/issues/9931
+        ExternalProject_add(
+            openssl
+            URL https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
+            PREFIX openssl
+            CONFIGURE_COMMAND perl <SOURCE_DIR>/Configure VC-WIN64A --prefix=${NATIVE_INSTALL_PREFIX} --openssldir=${NATIVE_INSTALL_PREFIX} ${OPENSSL_BUILD_TYPE} no-shared no-asm no-tests /FS
+            BUILD_COMMAND set MAKEFLAGS= && set set CL=/O2 /MT /DNDEBUG /FS && jom -j ${BUILD_PARALLEL_JOBS} build_libs
+            INSTALL_COMMAND set MAKEFLAGS= && nmake install_dev
+            )
+    else()
+        message(STATUS "Falling back to nmake for OpenSSL build using single core")
+           ExternalProject_add(
+            openssl
+            URL https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
+            PREFIX openssl
+            CONFIGURE_COMMAND perl <SOURCE_DIR>/Configure VC-WIN64A --prefix=${NATIVE_INSTALL_PREFIX} --openssldir=${NATIVE_INSTALL_PREFIX} ${OPENSSL_BUILD_TYPE} no-shared no-asm no-tests
+            BUILD_COMMAND set MAKEFLAGS= && nmake build_libs
+            INSTALL_COMMAND nmake install_dev
         )
+    endif()
 
 else()
     ExternalProject_add(
@@ -112,7 +130,7 @@ else()
         URL https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
         PREFIX openssl
         CONFIGURE_COMMAND <SOURCE_DIR>/config ${OPENSSL_BUILD_TYPE} --prefix=${CMAKE_INSTALL_PREFIX} no-shared
-        BUILD_COMMAND make -j${BUILD_PARALLEL_JOBS}
-        INSTALL_COMMAND make install_sw
+        BUILD_COMMAND make -j${BUILD_PARALLEL_JOBS} build_libs
+        INSTALL_COMMAND make install_dev
         )
 endif()
diff --git a/third_party/protobuf/CMakeLists.txt b/third_party/protobuf/CMakeLists.txt
index 9ac92d2d..706e8e5f 100644
--- a/third_party/protobuf/CMakeLists.txt
+++ b/third_party/protobuf/CMakeLists.txt
@@ -8,6 +8,7 @@ list(APPEND CMAKE_ARGS
     "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}"
     "-DCMAKE_TOOLCHAIN_FILE:PATH=${CMAKE_TOOLCHAIN_FILE}"
     "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
+    "-DBUILD_SHARED_LIBS=OFF"
     "-Dprotobuf_BUILD_LIBUPB=OFF"
     "-Dprotobuf_BUILD_TESTS=OFF"
     "-Dprotobuf_BUILD_SHARED_LIBS=OFF"
diff --git a/third_party/zlib/CMakeLists.txt b/third_party/zlib/CMakeLists.txt
index 42561ac2..c85177f2 100644
--- a/third_party/zlib/CMakeLists.txt
+++ b/third_party/zlib/CMakeLists.txt
@@ -9,6 +9,7 @@ list(APPEND CMAKE_ARGS
     "-DCMAKE_TOOLCHAIN_FILE:PATH=${CMAKE_TOOLCHAIN_FILE}"
     "-DCMAKE_POSITION_INDEPENDENT_CODE=ON"
     "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
+    "-DBUILD_SHARED_LIBS=OFF
     )
 
 if(IOS)


Test patch:
diff --git a/src/unit_tests/CMakeLists.txt b/src/unit_tests/CMakeLists.txt
index 444bdbe3..57ee5fd3 100644
--- a/src/unit_tests/CMakeLists.txt
+++ b/src/unit_tests/CMakeLists.txt
@@ -32,11 +32,4 @@ target_compile_definitions(unit_tests_runner
     BUILD_WITHOUT_CURL=1
 )
 
-if (MSVC AND BUILD_SHARED_LIBS)
-    target_compile_definitions(unit_tests_runner PRIVATE -DGTEST_LINKED_AS_SHARED_LIBRARY)
-    set_target_properties(unit_tests_runner
-        PROPERTIES COMPILE_FLAGS "${warnings} /wd4275"
-    )
-endif()
-
 add_test(unit_tests unit_tests_runner)
diff --git a/third_party/gtest/CMakeLists.txt b/third_party/gtest/CMakeLists.txt
index 29e3c057..518e56d9 100644
--- a/third_party/gtest/CMakeLists.txt
+++ b/third_party/gtest/CMakeLists.txt
@@ -9,7 +9,7 @@ list(APPEND CMAKE_ARGS
     "-DCMAKE_TOOLCHAIN_FILE:PATH=${CMAKE_TOOLCHAIN_FILE}"
     "-DCMAKE_POSITION_INDEPENDENT_CODE=ON"
     "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
-    "-DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS}"
+    "-DBUILD_SHARED_LIBS=OFF"
     )
 
 if(IOS)