Apple M3 MacOS arm64 编译QGroundControl5.0.8(base on Qt 6.8.3)
1.修改相关.cmake文件
CMake版本: cmake version 4.1.0
Toolchain.cmake修改如下
Qt6LinguistToolsMacros.cmake
注释掉下图所示:
FindGStreamer.cmake
修改如下:
增加iOS平台GStreamer链接目录
去掉GStreamer.pkg自动下载,改为手动下载
https://gstreamer.freedesktop.org/data/pkg/ios/1.26.5/gstreamer-1.0-devel-1.26.5-ios-universal.pkg
变改版本为1.26.5
手动下载操作如下:
注意,每次重新生成是8b4033e03c4b5c34fb69a23b329505847f91858d这个guid是会变的,需要重新命名为最新的
下载好pkg
重命名为gstreamer.pkg
手动解压到Payload文件中
解压gstreamer-1.0-devel-1.22.12-ios-universal.pkg到gstreamer-pkg-expanded中
pkgutil --expand gstreamer.pkg gstreamer-pkg-expanded
进入gstreamer-pkg-expanded解压ios-framework-1.22.12-universal.pkg
mkdir Payload
cd Payload
cat ios-framework-1.22.12-universal.pkg/Payload | gunzip | cpio -i
修改后的FindGStreamer.cmake
路径: ~/Desktop/qgroundcontrol/cmake/find-modules/FindGStreamer.cmake
if(NOT DEFINED GStreamer_FIND_VERSION)if(LINUX)set(GStreamer_FIND_VERSION 1.20)else()#set(GStreamer_FIND_VERSION 1.22.12)set(GStreamer_FIND_VERSION 1.26.5)endif()
endif()if(NOT DEFINED GStreamer_ROOT_DIR)if(DEFINED GSTREAMER_ROOT)set(GStreamer_ROOT_DIR ${GSTREAMER_ROOT})elseif(DEFINED GStreamer_ROOT)set(GStreamer_ROOT_DIR ${GStreamer_ROOT})endif()if(DEFINED GStreamer_ROOT_DIR AND NOT EXISTS "${GStreamer_ROOT_DIR}")message(STATUS "The user provided GStreamer directory does not exist: ${GStreamer_ROOT_DIR}")endif()
endif()if(NOT DEFINED GStreamer_USE_STATIC_LIBS)if(ANDROID OR IOS)set(GStreamer_USE_STATIC_LIBS ON)else()set(GStreamer_USE_STATIC_LIBS OFF)endif()
endif()if(NOT DEFINED GStreamer_USE_FRAMEWORK)if(APPLE)set(GStreamer_USE_FRAMEWORK ON)else()set(GStreamer_USE_FRAMEWORK OFF)endif()
endif()################################################################################set(PKG_CONFIG_ARGN)if(WIN32)if(NOT DEFINED GStreamer_ROOT_DIR)if(DEFINED ENV{GSTREAMER_1_0_ROOT_X86_64} AND EXISTS "$ENV{GSTREAMER_1_0_ROOT_X86_64}")set(GStreamer_ROOT_DIR "$ENV{GSTREAMER_1_0_ROOT_X86_64}")elseif(MSVC AND DEFINED ENV{GSTREAMER_1_0_ROOT_MSVC_X86_64} AND EXISTS "$ENV{GSTREAMER_1_0_ROOT_MSVC_X86_64}")set(GStreamer_ROOT_DIR "$ENV{GSTREAMER_1_0_ROOT_MSVC_X86_64}")elseif(MINGW AND DEFINED ENV{GSTREAMER_1_0_ROOT_MINGW_X86_64} AND EXISTS "$ENV{GSTREAMER_1_0_ROOT_MINGW_X86_64}")set(GStreamer_ROOT_DIR "$ENV{GSTREAMER_1_0_ROOT_MINGW_X86_64}")elseif(EXISTS "C:/Program Files/gstreamer/1.0/msvc_x86_64")set(GStreamer_ROOT_DIR "C:/Program Files/gstreamer/1.0/msvc_x86_64")elseif(EXISTS "C:/gstreamer/1.0/msvc_x86_64")set(GStreamer_ROOT_DIR "C:/gstreamer/1.0/msvc_x86_64")endif()endif()cmake_path(CONVERT "${GStreamer_ROOT_DIR}" TO_CMAKE_PATH_LIST GStreamer_ROOT_DIR NORMALIZE)if(NOT EXISTS "${GStreamer_ROOT_DIR}")message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")endif()set(GSTREAMER_LIB_PATH "${GStreamer_ROOT_DIR}/lib")set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/gstreamer-1.0")set(GSTREAMER_INCLUDE_PATH "${GStreamer_ROOT_DIR}/include")set(ENV{PKG_CONFIG} "${GStreamer_ROOT_DIR}/bin")set(PKG_CONFIG_EXECUTABLE "$ENV{PKG_CONFIG}/pkg-config.exe")set(ENV{PKG_CONFIG_PATH} "${GSTREAMER_LIB_PATH}/pkgconfig;${GSTREAMER_PLUGIN_PATH}/pkgconfig;$ENV{PKG_CONFIG_PATH}")list(APPEND PKG_CONFIG_ARGN--dont-define-prefix--define-variable=prefix=${GStreamer_ROOT_DIR}--define-variable=libdir=${GSTREAMER_LIB_PATH}--define-variable=includedir=${GSTREAMER_INCLUDE_PATH})
elseif(LINUX)if(NOT DEFINED GStreamer_ROOT_DIR)if(EXISTS "/usr")set(GStreamer_ROOT_DIR "/usr")endif()endif()cmake_path(CONVERT "${GStreamer_ROOT_DIR}" TO_CMAKE_PATH_LIST GStreamer_ROOT_DIR NORMALIZE)if(NOT EXISTS "${GStreamer_ROOT_DIR}")message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")endif()if((EXISTS "${GStreamer_ROOT_DIR}/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu" ) AND (EXISTS "${GStreamer_ROOT_DIR}/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/gstreamer-1.0"))set(GSTREAMER_LIB_PATH "${GStreamer_ROOT_DIR}/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu")elseif(EXISTS "${GStreamer_ROOT_DIR}/lib")set(GSTREAMER_LIB_PATH "${GStreamer_ROOT_DIR}/lib")else()message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")endif()set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/gstreamer-1.0")set(GSTREAMER_INCLUDE_PATH "${GStreamer_ROOT_DIR}/include")set(ENV{PKG_CONFIG_PATH} "${GSTREAMER_LIB_PATH}/pkgconfig:$ENV{PKG_CONFIG_PATH}")
elseif(ANDROID)if(QGC_CUSTOM_GST_PACKAGE)set(_gst_android_url "https://qgroundcontrol.s3.us-west-2.amazonaws.com/android-gstreamer/qgc-android-gstreamer-${GStreamer_FIND_VERSION}.tar.xz")else()set(_gst_android_url "https://gstreamer.freedesktop.org/data/pkg/android/${GStreamer_FIND_VERSION}/gstreamer-1.0-android-universal-${GStreamer_FIND_VERSION}.tar.xz")# https://gstreamer.freedesktop.org/data/pkg/android/${GStreamer_FIND_VERSION}/gstreamer-1.0-android-universal-${GStreamer_FIND_VERSION}.tar.xz.sha256sum# set(_gst_android_url_hash "be92cf477d140c270b480bd8ba0e26b1e01c8db042c46b9e234d87352112e485")endif()CPMAddPackage(NAME gstreamerVERSION ${GStreamer_FIND_VERSION}URL ${_gst_android_url}# URL_HASH ${_gst_android_url_hash})if(NOT DEFINED GStreamer_ROOT_DIR)if(CMAKE_ANDROID_ARCH_ABI STREQUAL "armeabi-v7a")set(GStreamer_ROOT_DIR "${gstreamer_SOURCE_DIR}/armv7")elseif(CMAKE_ANDROID_ARCH_ABI STREQUAL "arm64-v8a")set(GStreamer_ROOT_DIR "${gstreamer_SOURCE_DIR}/arm64")elseif(CMAKE_ANDROID_ARCH_ABI STREQUAL "x86")set(GStreamer_ROOT_DIR "${gstreamer_SOURCE_DIR}/x86")elseif(CMAKE_ANDROID_ARCH_ABI STREQUAL "x86_64")set(GStreamer_ROOT_DIR "${gstreamer_SOURCE_DIR}/x86_64")endif()endif()cmake_path(CONVERT "${GStreamer_ROOT_DIR}" TO_CMAKE_PATH_LIST GStreamer_ROOT_DIR NORMALIZE)if(NOT EXISTS "${GStreamer_ROOT_DIR}")message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")endif()set(GSTREAMER_LIB_PATH "${GStreamer_ROOT_DIR}/lib")set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/gstreamer-1.0")set(GSTREAMER_INCLUDE_PATH "${GStreamer_ROOT_DIR}/include")set(ENV{PKG_CONFIG_PATH} "")if(CMAKE_HOST_WIN32)set(ENV{PKG_CONFIG} "${GStreamer_ROOT_DIR}/share/gst-android/ndk-build/tools/windows")set(PKG_CONFIG_EXECUTABLE "$ENV{PKG_CONFIG}/pkg-config.exe")set(ENV{PKG_CONFIG_LIBDIR} "${GSTREAMER_LIB_PATH}/pkgconfig;${GSTREAMER_PLUGIN_PATH}/pkgconfig")list(APPEND PKG_CONFIG_ARGN --dont-define-prefix)elseif(CMAKE_HOST_UNIX)set(ENV{PKG_CONFIG_LIBDIR} "${GSTREAMER_LIB_PATH}/pkgconfig:${GSTREAMER_PLUGIN_PATH}/pkgconfig")endif()list(APPEND PKG_CONFIG_ARGN--define-variable=prefix=${GStreamer_ROOT_DIR}--define-variable=libdir=${GSTREAMER_LIB_PATH}--define-variable=includedir=${GSTREAMER_INCLUDE_PATH})
elseif(MACOS)if(NOT DEFINED GStreamer_ROOT_DIR)if(EXISTS "/Library/Frameworks/GStreamer.framework")set(GStreamer_ROOT_DIR "/Library/Frameworks/GStreamer.framework/Versions/1.0")elseif(EXISTS "/opt/homebrew/opt/gstreamer")set(GStreamer_ROOT_DIR "/opt/homebrew/opt/gstreamer")elseif(EXISTS "/usr/local/opt/gstreamer")set(GStreamer_ROOT_DIR "/usr/local/opt/gstreamer")endif()endif()cmake_path(CONVERT "${GStreamer_ROOT_DIR}" TO_CMAKE_PATH_LIST GStreamer_ROOT_DIR NORMALIZE)if(NOT EXISTS "${GStreamer_ROOT_DIR}")message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")endif()if(GStreamer_USE_FRAMEWORK)set(GSTREAMER_FRAMEWORK_PATH "${GStreamer_ROOT_DIR}/../..")endif()set(GSTREAMER_INCLUDE_PATH "${GStreamer_ROOT_DIR}/include")set(GSTREAMER_LIB_PATH "${GStreamer_ROOT_DIR}/lib")#set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/gstreamer-1.0")set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/libexec/gstreamer-1.0")message("GStreamer_ROOT_DIR: ${GStreamer_ROOT_DIR}")message("GSTREAMER_FRAMEWORK_PATH: ${GSTREAMER_FRAMEWORK_PATH}")message("GSTREAMER_INCLUDE_PATH: ${GSTREAMER_INCLUDE_PATH}")message("GSTREAMER_LIB_PATH: ${GSTREAMER_LIB_PATH}")message("GSTREAMER_PLUGIN_PATH: ${GSTREAMER_PLUGIN_PATH}")set(ENV{PKG_CONFIG} "${GStreamer_ROOT_DIR}/bin")set(PKG_CONFIG_EXECUTABLE "$ENV{PKG_CONFIG}/pkg-config")set(ENV{PKG_CONFIG_PATH} "${GSTREAMER_LIB_PATH}/pkgconfig:${GSTREAMER_PLUGIN_PATH}/pkgconfig:$ENV{PKG_CONFIG_PATH}")list(APPEND PKG_CONFIG_ARGN--dont-define-prefix--define-variable=prefix=${GStreamer_ROOT_DIR}--define-variable=libdir=${GSTREAMER_LIB_PATH}--define-variable=includedir=${GSTREAMER_INCLUDE_PATH})if(NOT EXISTS "${GStreamer_ROOT_DIR}" OR NOT EXISTS "${GSTREAMER_LIB_PATH}" OR NOT EXISTS "${GSTREAMER_PLUGIN_PATH}" OR NOT EXISTS "${GSTREAMER_INCLUDE_PATH}")message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")endif()
elseif(IOS)#message(FATAL_ERROR "GStreamer for iOS is Currently Unsupported.")CPMAddPackage(NAME gstreamerVERSION ${GStreamer_FIND_VERSION}URL "https://gstreamer.freedesktop.org/data/pkg/ios/${GStreamer_FIND_VERSION}/gstreamer-1.0-devel-${GStreamer_FIND_VERSION}-ios-universal.pkg")set(GST_PKG_FILE "${gstreamer_SOURCE_DIR}/gstreamer.pkg")set(GST_EXPAND_DIR "${gstreamer_SOURCE_DIR}/gstreamer-pkg-expanded")set(GST_PAYLOAD_DIR "${GST_EXPAND_DIR}/Payload")#file(MAKE_DIRECTORY "${GST_EXPAND_DIR}") #new version pkgutil auto create itexecute_process(#COMMAND pkgutil --expand-full "${GST_PKG_FILE}" "${GST_EXPAND_DIR}"#COMMAND pkgutil --expand "${GST_PKG_FILE}" "${GST_EXPAND_DIR}"COMMAND pwdCOMMAND ls ${GST_EXPAND_DIR}RESULT_VARIABLE _pkgutil_rc)if(NOT _pkgutil_rc EQUAL 0)message(FATAL_ERROR "pkgutil failed to expand GStreamer .pkg")endif()execute_process(#COMMAND xar -xf "${GST_EXPAND_DIR}/gstreamer-1.0-devel-${GStreamer_FIND_VERSION}-ios-universal.pkg/Payload"# --directory "${GST_PAYLOAD_DIR}"#COMMAND mkdir Payload#COMMAND cd Payload#COMMAND cat "${GST_EXPAND_DIR}/ios-framework-${GStreamer_FIND_VERSION}-universal.pkg/Payload" | gunzip | cpio -iCOMMAND ls ${GST_PAYLOAD_DIR}RESULT_VARIABLE _xar_rc)if(NOT _xar_rc EQUAL 0)message(FATAL_ERROR "xar failed to extract GStreamer Payload")endif()# set(GSTREAMER_FRAMEWORK_PATH "/Library/Developer/GStreamer/iPhone.sdk" CACHE PATH "Path of GStreamer.Framework")# set(GSTREAMER_FRAMEWORK_PATH "${GST_PAYLOAD_DIR}/usr/local/Frameworks/GStreamer.framework")set(GSTREAMER_FRAMEWORK_PATH "${GST_PAYLOAD_DIR}/GStreamer.framework")set(GStreamer_ROOT_DIR "${GSTREAMER_FRAMEWORK_PATH}/Versions/1.0")if(NOT EXISTS "${GStreamer_ROOT_DIR}")message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")endif()set(GSTREAMER_INCLUDE_PATH "${GSTREAMER_FRAMEWORK_PATH}/Headers")
endif()if(GStreamer_USE_FRAMEWORK AND NOT EXISTS "${GSTREAMER_FRAMEWORK_PATH}")message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")
endif()################################################################################if(GStreamer_USE_STATIC_LIBS)set(GSTREAMER_EXTRA_DEPSgstreamer-base-1.0gstreamer-video-1.0gstreamer-gl-1.0gstreamer-gl-prototypes-1.0gstreamer-rtsp-1.0# gstreamer-gl-egl-1.0# gstreamer-gl-wayland-1.0# gstreamer-gl-x11-1.0)set(GSTREAMER_PLUGINScoreelementsdav1disomp4libavmatroskampegtsdemuxopenglopenh264playbackrtprtpmanagerrtspsdpelemtcptypefindfunctionsudpvideoparsersbadvpx)if(ANDROID)list(APPEND GSTREAMER_PLUGINS androidmedia) # vulkanelseif(APPLE)list(APPEND GSTREAMER_PLUGINS applemedia vulkan)elseif(WIN32)list(APPEND GSTREAMER_PLUGINS d3d d3d11 d3d12 dxva nvcodec)elseif(LINUX)list(APPEND GSTREAMER_PLUGINS nvcodec qsv va vulkan) # qml6 - GStreamer provided qml6 is xcb onlyendif()
endif()if(ANDROID)set(GStreamer_Mobile_MODULE_NAME gstreamer_android)set(G_IO_MODULES openssl)set(G_IO_MODULES_PATH "${GStreamer_ROOT_DIR}/lib/gio/modules")set(GStreamer_NDK_BUILD_PATH "${GStreamer_ROOT_DIR}/share/gst-android/ndk-build/")set(GSTREAMER_ANDROID_MODULE_NAME gstreamer_android)set(GSTREAMER_JAVA_SRC_DIR "${CMAKE_BINARY_DIR}/android-build-${CMAKE_PROJECT_NAME}/src")set(GSTREAMER_ASSETS_DIR "${CMAKE_BINARY_DIR}/android-build-${CMAKE_PROJECT_NAME}/assets")configure_file("${GStreamer_NDK_BUILD_PATH}/gstreamer_android-1.0.c.in""${GStreamer_Mobile_MODULE_NAME}.c")
endif()################################################################################if(GStreamer_USE_FRAMEWORK)list(APPEND CMAKE_FRAMEWORK_PATH "${GSTREAMER_FRAMEWORK_PATH}")
endif()if(GStreamer_USE_STATIC_LIBS)list(APPEND PKG_CONFIG_ARGN "--static")
endif()find_package(PkgConfig REQUIRED QUIET)list(PREPEND CMAKE_PREFIX_PATH ${GStreamer_ROOT_DIR})
if(LINUX)pkg_check_modules(PC_GSTREAMER REQUIRED gstreamer-1.0>=${GStreamer_FIND_VERSION})
else()pkg_check_modules(PC_GSTREAMER REQUIRED gstreamer-1.0=${GStreamer_FIND_VERSION})
endif()
set(GStreamer_VERSION "${PC_GSTREAMER_VERSION}")################################################################################function(find_gstreamer_component component pkgconfig_name)set(target GStreamer::${component})if(NOT TARGET ${target})string(TOUPPER ${component} upper)pkg_check_modules(PC_GSTREAMER_${upper} IMPORTED_TARGET ${pkgconfig_name})if(TARGET PkgConfig::PC_GSTREAMER_${upper})qt_add_library(GStreamer::${component} INTERFACE IMPORTED)target_link_libraries(GStreamer::${component} INTERFACE PkgConfig::PC_GSTREAMER_${upper})if("PC_GSTREAMER_${upper}" MATCHES "PC_GSTREAMER_GL")get_target_property(_qt_incs PkgConfig::PC_GSTREAMER_GL INTERFACE_INCLUDE_DIRECTORIES)set(__qt_fixed_incs)foreach(path IN LISTS _qt_incs)if(IS_DIRECTORY "${path}")list(APPEND __qt_fixed_incs "${path}")endif()endforeach()set_property(TARGET PkgConfig::PC_GSTREAMER_GL PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${__qt_fixed_incs}")endif()endif()endif()if(TARGET ${target})set(GStreamer_${component}_FOUND TRUE PARENT_SCOPE)endif()
endfunction()################################################################################find_gstreamer_component(Core gstreamer-1.0)
find_gstreamer_component(Base gstreamer-base-1.0)
find_gstreamer_component(Video gstreamer-video-1.0)
find_gstreamer_component(Gl gstreamer-gl-1.0)
find_gstreamer_component(GlPrototypes gstreamer-gl-prototypes-1.0)
find_gstreamer_component(Rtsp gstreamer-rtsp-1.0)################################################################################if(GlEgl IN_LIST GStreamer_FIND_COMPONENTS)find_gstreamer_component(GlEgl gstreamer-gl-egl-1.0)
endif()if(GlWayland IN_LIST GStreamer_FIND_COMPONENTS)find_gstreamer_component(GlWayland gstreamer-gl-wayland-1.0)
endif()if(GlX11 IN_LIST GStreamer_FIND_COMPONENTS)find_gstreamer_component(GlX11 gstreamer-gl-x11-1.0)
endif()################################################################################include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GStreamerVERSION_VAR GStreamer_VERSIONHANDLE_COMPONENTS
)if(GStreamer_FOUND AND NOT TARGET GStreamer::GStreamer)qt_add_library(GStreamer::GStreamer INTERFACE IMPORTED)if(GStreamer_USE_STATIC_LIBS)target_compile_definitions(GStreamer::GStreamer INTERFACE QGC_GST_STATIC_BUILD)endif()if(APPLE AND GStreamer_USE_FRAMEWORK)message("===>GSTREAMER_FRAMEWORK_PATH: ${GSTREAMER_FRAMEWORK_PATH}")set(CMAKE_FIND_FRAMEWORK ONLY)find_library(GSTREAMER_FRAMEWORK GStreamerPATHS"${GSTREAMER_FRAMEWORK_PATH}""/Library/Frameworks""/usr/local/opt/gstreamer""/opt/homebrew/opt/gstreamer"NO_DEFAULT_PATH)unset(CMAKE_FIND_FRAMEWORK)message("===>GSTREAMER_FRAMEWORK: ${GSTREAMER_FRAMEWORK}")if(IOS)target_link_libraries(GStreamer::GStreamer INTERFACE ${GSTREAMER_FRAMEWORK_PATH})target_include_directories(GStreamer::GStreamer INTERFACE "${GSTREAMER_FRAMEWORK_PATH}/Headers")return()endif()if(MACOS)if(GSTREAMER_FRAMEWORK)target_link_libraries(GStreamer::GStreamer INTERFACE ${GSTREAMER_FRAMEWORK})target_include_directories(GStreamer::GStreamer INTERFACE "${GSTREAMER_FRAMEWORK}/Headers")if(MACOS)target_compile_definitions(GStreamer::GStreamer INTERFACE QGC_GST_MACOS_FRAMEWORK)endif()return()else()message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")endif()endif()elseif(ANDROID)target_link_options(GStreamer::GStreamer INTERFACE "-Wl,-Bsymbolic")if(CMAKE_SIZEOF_VOID_P EQUAL 4)target_link_options(GStreamer::GStreamer INTERFACE "-Wl,-z,notext")endif()endif()target_link_directories(GStreamer::GStreamer INTERFACE ${GSTREAMER_LIB_PATH})target_link_libraries(GStreamer::GStreamerINTERFACEGStreamer::CoreGStreamer::BaseGStreamer::VideoGStreamer::GlGStreamer::GlPrototypesGStreamer::Rtsp)foreach(component IN LISTS GStreamer_FIND_COMPONENTS)if(GStreamer_${component}_FOUND)target_link_libraries(GStreamer::GStreamer INTERFACE GStreamer::${component})endif()endforeach()################################################################################if(GStreamer_USE_STATIC_LIBS)qt_add_library(GStreamer::Plugins INTERFACE IMPORTED)target_link_directories(GStreamer::Plugins INTERFACE ${GSTREAMER_PLUGIN_PATH})foreach(plugin IN LISTS GSTREAMER_PLUGINS)pkg_check_modules(GST_PLUGIN_${plugin} QUIET IMPORTED_TARGET gst${plugin})if(GST_PLUGIN_${plugin}_FOUND)target_link_libraries(GStreamer::Plugins INTERFACE PkgConfig::GST_PLUGIN_${plugin})else()find_library(GST_PLUGIN_${plugin}_LIBRARYNAMES gst${plugin}PATHS${GSTREAMER_LIB_PATH}${GSTREAMER_PLUGIN_PATH})if(GST_PLUGIN_${plugin}_LIBRARY)target_link_libraries(GStreamer::Plugins INTERFACE ${GST_PLUGIN_${plugin}_LIBRARY})set(GST_PLUGIN_${plugin}_FOUND TRUE)endif()endif()if(GST_PLUGIN_${plugin}_FOUND)target_compile_definitions(GStreamer::Plugins INTERFACE GST_PLUGIN_${plugin}_FOUND)endif()endforeach()target_link_libraries(GStreamer::GStreamer INTERFACE GStreamer::Plugins)endif()
endif()
修改后的CMakeLists.txt
路径: ~/Desktop/qgroundcontrol/src/VideoManager/VideoReceiver/GStreamer/CMakeLists.txt
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_sources(${CMAKE_PROJECT_NAME} PRIVATE VideoItemStub.h)if(QGC_ENABLE_GST_VIDEOSTREAMING)if(NOT MACOS)# Using FindGStreamer.cmake is currently bypassed on MACOS since it doesn't work# So for now we hack in a simple hardwired setup which does workfind_package(GStreamerREQUIREDCOMPONENTS Core Base Video Gl GlPrototypes Rtsp#OPTIONAL_COMPONENTS GlEgl GlWayland GlX11)endif()add_subdirectory(gstqml6gl)# TODO: https://gstreamer.freedesktop.org/documentation/qt6d3d11/index.html#qml6d3d11sink-page
endif()if(TARGET gstqml6gl)target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE gstqml6gl)target_sources(${CMAKE_PROJECT_NAME}PRIVATEGStreamer.ccGStreamer.hGStreamerHelpers.ccGStreamerHelpers.hGstVideoReceiver.ccGstVideoReceiver.h)add_subdirectory(gstqgc)target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QGC_GST_STREAMING)if(LINUX)install(DIRECTORY"${GSTREAMER_PLUGIN_PATH}""${GSTREAMER_LIB_PATH}/gio"DESTINATION "${CMAKE_INSTALL_LIBDIR}"FILES_MATCHINGPATTERN "*.so"PATTERN "*.so.*"PATTERN "*/include" EXCLUDE)install(DIRECTORY "${GSTREAMER_LIB_PATH}/gstreamer1.0"DESTINATION "${CMAKE_INSTALL_LIBDIR}"FILE_PERMISSIONSOWNER_READ OWNER_WRITE OWNER_EXECUTEGROUP_READ GROUP_EXECUTEWORLD_READ WORLD_EXECUTEFILES_MATCHINGPATTERN "gst-*")elseif(WIN32)install(DIRECTORY "${GStreamer_ROOT_DIR}/bin/"DESTINATION "${CMAKE_INSTALL_BINDIR}"FILES_MATCHINGPATTERN "*.dll")install(DIRECTORY "${GSTREAMER_LIB_PATH}/gio/modules/"DESTINATION "${CMAKE_INSTALL_LIBDIR}/gio/modules"FILES_MATCHINGPATTERN "*.dll")install(DIRECTORY "${GSTREAMER_PLUGIN_PATH}/"DESTINATION "${CMAKE_INSTALL_LIBDIR}/gstreamer-1.0"FILES_MATCHINGPATTERN "*.dll")install(DIRECTORY "${GStreamer_ROOT_DIR}/libexec/gstreamer-1.0/"DESTINATION "${CMAKE_INSTALL_LIBEXECDIR}/gstreamer-1.0"FILE_PERMISSIONSOWNER_READ OWNER_WRITE OWNER_EXECUTEGROUP_READ GROUP_EXECUTEWORLD_READ WORLD_EXECUTEFILES_MATCHINGPATTERN "*.exe")elseif(MACOS)if(GSTREAMER_FRAMEWORK)install(DIRECTORY "${GSTREAMER_FRAMEWORK}"DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_PROJECT_NAME}.app/Contents/Frameworks"PATTERN "*.la" EXCLUDEPATTERN "*.a" EXCLUDEPATTERN "*/bin" EXCLUDEPATTERN "*/etc" EXCLUDEPATTERN "*/gst-validate-launcher" EXCLUDEPATTERN "*/Headers" EXCLUDEPATTERN "*/include" EXCLUDEPATTERN "*/pkgconfig" EXCLUDEPATTERN "*/share" EXCLUDE)endif()endif()
endif()
Qt6LinguistToolsMacros.cmake
路径: ~/Qt/6.8.3/macos/lib/cmake/Qt6LinguistTools/Qt6LinguistToolsMacros.cmake
修改后的CustomOptions.cmake
include(CMakeDependentOption)
# The following options can be overriden by custom builds using the CustomOverrides.cmake file# App
set(QGC_APP_NAME "QGroundControl" CACHE STRING "App Name")
set(QGC_APP_COPYRIGHT "Copyright (c) 2025 QGroundControl. All rights reserved." CACHE STRING "Copyright")
set(QGC_APP_DESCRIPTION "Open Source Ground Control App" CACHE STRING "Description")
set(QGC_ORG_NAME "QGroundControl" CACHE STRING "Org Name")
set(QGC_ORG_DOMAIN "qgroundcontrol.com" CACHE STRING "Domain")
set(QGC_PACKAGE_NAME "org.mavlink.qgroundcontrol" CACHE STRING "Package Name")
set(QGC_SETTINGS_VERSION "9" CACHE STRING "Settings Version") # If you need to make an incompatible changes to stored settings, bump this version number up by 1. This will caused store settings to be cleared on next boot.# Build
option(BUILD_SHARED_LIBS "Build using shared libraries" OFF)
option(QGC_STABLE_BUILD "Stable Build" OFF)
option(QGC_USE_CACHE "Use Build Caching" ON)
option(QGC_BUILD_INSTALLER "Build Installer" ON)
cmake_dependent_option(QGC_BUILD_TESTING "Enable testing" ON "CMAKE_BUILD_TYPE STREQUAL Debug" OFF)
cmake_dependent_option(QGC_DEBUG_QML "Build QGroundControl with QML debugging/profiling support." ON "CMAKE_BUILD_TYPE STREQUAL Debug" OFF)# Features
option(QGC_UTM_ADAPTER "Enable UTM Adapter" OFF)
option(QGC_VIEWER3D "Enable Viewer3D" ON) # Qt6Quick3D_FOUND
# option(QGC_DISABLE_MAVLINK_INSPECTOR "Disable Mavlink Inspector" OFF) # This removes QtCharts which is GPL licensed# Comms
option(QGC_ENABLE_BLUETOOTH "Enable Bluetooth Links" ON) # Qt6Bluetooth_FOUND
option(QGC_ZEROCONF_ENABLED "Enable ZeroConf Compatibility" OFF)
option(QGC_AIRLINK_DISABLED "Disable AIRLink" ON)
option(QGC_NO_SERIAL_LINK "Disable Serial Links" OFF) # NOT IOS AND Qt6SerialPort_FOUND# Video
option(QGC_ENABLE_UVC "Enable UVC Devices" ON) # Qt6Multimedia_FOUND
option(QGC_ENABLE_GST_VIDEOSTREAMING "Enable GStreamer Video Backend" ON)
cmake_dependent_option(QGC_CUSTOM_GST_PACKAGE "Enable Using QGC Provided Custom GStreamer Packages" OFF "QGC_ENABLE_GST_VIDEOSTREAMING" OFF)
option(QGC_ENABLE_QT_VIDEOSTREAMING "Enable QtMultimedia Video Backend" ON) # Qt6Multimedia_FOUND# Joystick
# set(SDL_GAMECONTROLLERCONFIG "0300000009120000544f000011010000,OpenTX Radiomaster TX16S Joystick,leftx:a3,lefty:a2,rightx:a0,righty:a1,platform:Linux" CACHE STRING "Custom SDL Joystick Mappings")# MAVLink
set(QGC_MAVLINK_GIT_REPO "https://github.com/mavlink/c_library_v2.git" CACHE STRING "URL to MAVLink Git Repo")
set(QGC_MAVLINK_GIT_TAG "19f9955598af9a9181064619bd2e3c04bd2d848a" CACHE STRING "Tag of MAVLink Git Repo")# APM
option(QGC_DISABLE_APM_MAVLINK "Disable APM Dialect" OFF)
option(QGC_DISABLE_APM_PLUGIN "Disable APM Plugin" OFF)
option(QGC_DISABLE_APM_PLUGIN_FACTORY "Disable APM Plugin Factory" OFF)# PX4
option(QGC_DISABLE_PX4_PLUGIN "Disable PX4 Plugin" OFF)
option(QGC_DISABLE_PX4_PLUGIN_FACTORY "Disable PX4 Plugin Factory" OFF)# Android
set(QGC_QT_ANDROID_TARGET_SDK_VERSION "36" CACHE STRING "Android Target SDK Version")
set(QGC_ANDROID_PACKAGE_NAME "${QGC_PACKAGE_NAME}" CACHE STRING "Android Package Name")
set(QGC_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_SOURCE_DIR}/android" CACHE PATH "Android Package Path")
set(QT_ANDROID_DEPLOYMENT_TYPE "" CACHE STRING "Forces Signing if Set to Release")
option(QT_ANDROID_SIGN_APK "Enable Signing APK" OFF)
option(QT_ANDROID_SIGN_AAB "Enable Signing AAB" OFF)
option(QT_USE_TARGET_ANDROID_BUILD_DIR "Use Target Android Build Dir" OFF)
set(QGC_QT_MINIMUM_VERSION "6.8.3" CACHE STRING "Minimum Supported Qt Version")
set(QGC_QT_MAXIMUM_VERSION "6.8.3" CACHE STRING "Maximum Supported Qt Version")
set(QGC_QT_ANDROID_MIN_SDK_VERSION "28" CACHE STRING "Android Min SDK Version")# MacOS
set(QGC_MACOS_PLIST_PATH "${CMAKE_SOURCE_DIR}/deploy/macos/MacOSXBundleInfo.plist.in" CACHE FILEPATH "MacOS PList Path")
set(QGC_MACOS_BUNDLE_ID "${QGC_PACKAGE_NAME}" CACHE STRING "MacOS Bundle ID")
set(QGC_MACOS_ICON_PATH "${CMAKE_SOURCE_DIR}/deploy/macos/qgroundcontrol.icns" CACHE FILEPATH "MacOS Icon Path")
set(QGC_MACOS_ENTITLEMENTS_PATH "${CMAKE_SOURCE_DIR}/deploy/macos/qgroundcontrol.entitlements" CACHE FILEPATH "MacOS Entitlements Path")
option(QGC_MACOS_UNIVERSAL_BUILD "Build MacOS Universal Build (arm64;x86_64)" ON)# Linux
option(QGC_CREATE_APPIMAGE "Build an AppImage after build" ON)
set(QGC_APPIMAGE_ICON_256_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/QGroundControl_256.png" CACHE FILEPATH "AppImage Icon 256x256 Path")
set(QGC_APPIMAGE_ICON_SCALABLE_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/QGroundControl.svg" CACHE FILEPATH "AppImage Icon SVG Path")
set(QGC_APPIMAGE_APPRUN_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/AppRun" CACHE FILEPATH "AppImage AppRun Path")
set(QGC_APPIMAGE_DESKTOP_ENTRY_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.desktop.in" CACHE FILEPATH "AppImage Desktop Entry Path")
set(QGC_APPIMAGE_METADATA_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.appdata.xml.in" CACHE FILEPATH "AppImage Metadata Path")
set(QGC_APPIMAGE_APPDATA_DEVELOPER "qgroundcontrol" CACHE STRING "AppImage Metadata Developer")# Windows
set(QGC_WINDOWS_INSTALL_HEADER_PATH "${CMAKE_SOURCE_DIR}/deploy/windows/installheader.bmp" CACHE FILEPATH "Windows Install Header Path")
set(QGC_WINDOWS_ICON_PATH "${CMAKE_SOURCE_DIR}/deploy/windows/WindowsQGC.ico" CACHE FILEPATH "Windows Icon Path")
set(QGC_WINDOWS_RESOURCE_FILE_PATH "${CMAKE_SOURCE_DIR}/deploy/windows/QGroundControl.rc" CACHE FILEPATH "Windows Resource File Path")# CPM
set(QGC_CPM_SOURCE_CACHE "" CACHE PATH "Directory to Download CPM Dependencies, Overrides CPM_SOURCE_CACHE Env Variable")
# set(CPM_USE_NAMED_CACHE_DIRECTORIES ON CACHE BOOL "Use additional directory of package name in cache on the most nested level.")# Qt
set(QT_QML_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/qml" CACHE PATH "Install path for QML")
set(QML_IMPORT_PATH "${QT_QML_OUTPUT_DIRECTORY}" CACHE STRING "Extra QML Import Paths")
option(QT_SILENCE_MISSING_DEPENDENCY_TARGET_WARNING "Silence Missing Dependency Warnings" OFF)
option(QT_ENABLE_VERBOSE_DEPLOYMENT "Verbose Deployment" ON)
option(QT_DEBUG_FIND_PACKAGE "Print Used Search Paths When a Package is Not Found" ON)
option(QT_QML_GENERATE_QMLLS_INI "https://doc.qt.io/qt-6/cmake-variable-qt-qml-generate-qmlls-ini.html" ON)
# set(ENV{QT_DEBUG_PLUGINS} "1")
# set(ENV{QML_IMPORT_TRACE} "1")# CMAKE
# option(CMAKE_FIND_DEBUG_MODE "Print Used Search Paths When Finding a Package" OFF)
修改完成后run CMake重新生成