You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下Dart FFI加载预编译GStreamer动态库失败求助

Windows Flutter应用中GStreamer DLL加载失败(错误码126)解决方案

问题概述

我正在为GStreamer开发Dart FFI插件,用于Windows平台的Flutter应用,后续计划扩展到其他平台。GStreamer基于C语言,原本以为绑定创建会很简单,但使用官方下载的MSVC 64-bit (VS 2019, Release CRT) 1.22.4 runtime installer预编译库时,出现加载失败错误:

Invalid argument(s): Failed to load dynamic library 'gstreamer-1.0-0.dll': error code 126

已确认DLL路径正确,且已添加到插件的CMakeLists.txt中,相关配置和环境信息如下:

CMakeLists.txt配置

cmake_minimum_required(VERSION 3.14)

set(PROJECT_NAME "gstreamer")
project(${PROJECT_NAME} LANGUAGES CXX)

set(PLUGIN_NAME "gstreamer_plugin")

list(APPEND PLUGIN_SOURCES
  "gstreamer_plugin.cpp"
  "gstreamer_plugin.h"
)

add_library(${PLUGIN_NAME} SHARED
  "include/gstreamer/gstreamer_plugin_c_api.h"
  "gstreamer_plugin_c_api.cpp"
  ${PLUGIN_SOURCES}
)

apply_standard_settings(${PLUGIN_NAME})

set_target_properties(${PLUGIN_NAME} PROPERTIES
  CXX_VISIBILITY_PRESET hidden)
target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)


target_include_directories(${PLUGIN_NAME} INTERFACE
  "${CMAKE_CURRENT_SOURCE_DIR}/include")
target_link_libraries(${PLUGIN_NAME} PRIVATE flutter flutter_wrapper_plugin)

# Eveything is Dart's default plugin staff
set(gstreamer_bundled_libraries
  # Only added this line
  "${CMAKE_CURRENT_SOURCE_DIR}/gstreamer-1.0-0.dll"
  PARENT_SCOPE
)

Flutter环境

Flutter (Channel stable, 3.10.5, on Microsoft Windows [Version 10.0.22621.1928], locale en-US)
[√] Windows Version (Installed version of Windows is version 10 or higher)
[√] Android toolchain - develop for Android devices (Android SDK version 34.0.0-rc4)
[√] Chrome - develop for the web
[√] Visual Studio - develop for Windows (Visual Studio Community 2022 17.6.4)
[√] Android Studio (version 2022.2)
[√] VS Code (version 1.79.2)
[√] Connected device (3 available)
[√] Network resources

问题成因

Windows错误码126的核心原因是系统无法找到DLL本身或其依赖的其他动态库,具体到GStreamer场景,常见诱因:

  1. 缺失依赖库:GStreamer主DLLgstreamer-1.0-0.dll依赖大量组件(如glib-2.0-0.dll、gobject-2.0-0.dll等),仅单独放入主DLL无法正常加载。
  2. CRT版本不匹配:你使用VS2019编译的Release CRT版本库,但插件编译环境是VS2022,存在C运行时库版本冲突。
  3. 路径搜索问题:即使DLL在插件目录,Windows加载器可能无法在进程搜索路径中找到它或其依赖项。
  4. 架构不匹配:下载的32位库被64位Flutter进程加载,导致兼容性问题。

解决方法

1. 完整部署GStreamer依赖库

GStreamer runtime installer会将所有依赖库安装到系统路径,若手动复制DLL,需把安装目录bin下的所有文件复制到插件输出目录(或Flutter应用的build/windows/runner/Release目录),并更新CMakeLists.txt的gstreamer_bundled_libraries列表,加入所有必要依赖DLL。

2. 匹配CRT版本

  • 下载与VS2022对应的GStreamer版本:MSVC 64-bit (VS 2022, Release CRT),替换现有库。
  • 或在VS2022中配置项目使用VS2019工具集(项目属性→常规→平台工具集选择v142),匹配GStreamer编译环境。

3. 确保DLL搜索路径正确

  • 在CMakeLists.txt中添加指令,强制将GStreamer DLL复制到应用输出目录:
# 复制GStreamer DLL到输出目录
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/gstreamer-bin/" DESTINATION "${CMAKE_BINARY_DIR}/runner/Release")
  • 运行应用前,将GStreamer的bin目录添加到系统PATH环境变量。

4. 验证架构一致性

  • 确认Flutter构建64位应用:运行flutter run -d windows --release,默认是64位,可通过flutter config --enable-windows-desktop确保启用64位支持。
  • 检查下载的GStreamer库是否为64位版本,避免32位库被加载。

其他可选方法

  1. 使用GStreamer开发包:下载包含头文件和导入库的开发包,在CMake中链接静态导入库gstreamer-1.0.lib,编译时明确依赖,确保DLL正确部署。
  2. 用vcpkg管理依赖:通过vcpkg安装GStreamer,CMake自动处理依赖和路径,避免手动复制DLL的麻烦。
  3. 指定绝对路径加载:在Dart代码中使用DLL绝对路径加载:
final dllPath = path.join(Directory.current.path, 'gstreamer-1.0-0.dll');
final gstreamer = DynamicLibrary.open(dllPath);
  1. 用Dependency Walker排查:运行depends.exe打开gstreamer-1.0-0.dll,查看缺失的依赖库,针对性解决。

内容的提问来源于stack exchange,提问作者NattyPluz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:21:59