Skip to content

Commit cbf5eb0

Browse files
committed
适配官网版 VLC:静态链接 libvpx 去掉运行时 DLL 依赖
原本插件 DLL 动态链接 libvpx-1.dll(以及静态 libvpx 会引入的 libgcc/ libwinpthread)。MSYS2 版 VLC 因这些 DLL 在 PATH 上能加载,但官网版 VLC 不自带,LoadLibrary 缺依赖而静默失败、插件不被识别。 - CMakeLists: 新增 USM_STATIC_VPX 选项(Windows 默认 ON),强制找到静态 libvpx.a 链接;并 -static-libgcc + 静态链接 winpthread,使最终 DLL 仅依赖 libvlccore.dll 和系统库 - README: 说明 Windows 默认静态链接、官网版/ MSYS2 版均可加载 已实测:官网版 VLC 3.0.23 GUI 下加载 usm demux、libvpx 探针自动选 key、 avcodec 解码 VP9、direct3d11 正常播放(exit 0)。
1 parent 831ed9c commit cbf5eb0

2 files changed

Lines changed: 43 additions & 6 deletions

File tree

CMakeLists.txt

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,42 @@ set_target_properties(usm_plugin PROPERTIES
4545
target_include_directories(usm_plugin PRIVATE ${VLC_PLUGIN_INCLUDE_DIRS} src)
4646
target_include_directories(usm_plugin PRIVATE ${VPX_INCLUDE_DIRS})
4747
target_compile_options(usm_plugin PRIVATE ${VLC_PLUGIN_CFLAGS_OTHER} -Wall -Wextra ${PLUGIN_WIN_C_FLAGS})
48-
target_link_libraries(usm_plugin PRIVATE usm_core ${VLC_PLUGIN_LIBRARIES} ${VPX_LIBRARIES})
48+
49+
# Windows:静态链接 libvpx,避免依赖 libvpx-1.dll。官网版 VLC 不自带 libvpx-1.dll,
50+
# 动态链接会让 LoadLibrary 因缺依赖而静默失败、插件不被加载。静态进 DLL 后插件只剩
51+
# libvlccore.dll 和系统库依赖,官网版即可加载。
52+
if(WIN32)
53+
set(_usm_static_vpx_default ON)
54+
else()
55+
set(_usm_static_vpx_default OFF)
56+
endif()
57+
option(USM_STATIC_VPX "Statically link libvpx into the plugin (default ON on Windows)"
58+
${_usm_static_vpx_default})
59+
60+
if(USM_STATIC_VPX)
61+
# 在库搜索后缀里临时只留 .a,强制找到静态 libvpx.a 而非 libvpx.dll.a 导入库
62+
set(_usm_saved_suffixes ${CMAKE_FIND_LIBRARY_SUFFIXES})
63+
set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
64+
find_library(VPX_STATIC_LIBRARY NAMES vpx
65+
HINTS ${VPX_STATIC_LIBRARY_DIRS} ${VPX_LIBRARY_DIRS})
66+
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_usm_saved_suffixes})
67+
if(NOT VPX_STATIC_LIBRARY)
68+
message(FATAL_ERROR "USM_STATIC_VPX 为 ON 但未找到静态 libvpx.a")
69+
endif()
70+
set(USM_VPX_LINK ${VPX_STATIC_LIBRARY})
71+
else()
72+
set(USM_VPX_LINK ${VPX_LIBRARIES})
73+
endif()
74+
75+
target_link_libraries(usm_plugin PRIVATE usm_core ${VLC_PLUGIN_LIBRARIES} ${USM_VPX_LINK})
4976
target_link_directories(usm_plugin PRIVATE ${VLC_PLUGIN_LIBRARY_DIRS} ${VPX_LIBRARY_DIRS})
77+
if(WIN32)
78+
# 静态 libvpx 会引入 libgcc / libwinpthread 依赖。只把这两者静态链进来
79+
# (libvlccore 仍动态链接,它没有静态库),让最终 DLL 不依赖任何 mingw 运行时
80+
# DLL,官网版 VLC 才能直接加载。-Bstatic/-Bdynamic 必须排在 libvpx.a 之后。
81+
target_link_options(usm_plugin PRIVATE -static-libgcc)
82+
target_link_libraries(usm_plugin PRIVATE -Wl,-Bstatic winpthread -Wl,-Bdynamic)
83+
endif()
5084
target_compile_definitions(usm_plugin PRIVATE _GNU_SOURCE MODULE_STRING="usm")
5185

5286
execute_process(

README.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,16 @@ sudo pacman -U vlc-plugin-usm-0.1.0-3-x86_64.pkg.tar.zst
5555

5656
把构建出的 `libusm_plugin.dll` 放进 VLC 的 `plugins/demux` 目录:
5757

58-
- MSYS2 版 VLC:`C:\msys64\mingw64\lib\vlc\plugins\demux\`
5958
- 官网版 VLC:`C:\Program Files\VideoLAN\VLC\plugins\demux\`
59+
- MSYS2 版 VLC:`C:\msys64\mingw64\lib\vlc\plugins\demux\`
6060

61-
> 注意:本插件依赖 libvpx,MSYS2 构建出的 DLL 会动态链接 `libvpx-1.dll` 以及
62-
> mingw 运行时(`libgcc_s_seh-1.dll``libwinpthread-1.dll`)。MSYS2 版 VLC 因为
63-
> 这些 DLL 在 `mingw64\bin`(已在 PATH 上)能正常加载;官网版 VLC 不自带这些 DLL,
64-
> 直接拷过去会因找不到依赖而静默加载失败。让官网版可用的方案仍在完善中。
61+
> Windows 构建默认会把 libvpx 以及 mingw 运行时(libgcc / libwinpthread)静态链接进
62+
> DLL(CMake 选项 `USM_STATIC_VPX`,Windows 下默认 ON)。这样最终 DLL 只依赖
63+
> `libvlccore.dll`(VLC 自带)和系统库,**官网版 VLC 和 MSYS2 版 VLC 都能直接加载**
64+
> 不需要额外拷 `libvpx-1.dll`。已在官网版 VLC 3.0.23 上实测可正常解复用并播放。
65+
>
66+
> 如果想动态链接 libvpx(DLL 更小,但需自行保证 `libvpx-1.dll` 在 VLC 能找到的路径
67+
> 上),配置时加 `-DUSM_STATIC_VPX=OFF`
6568
6669
安装后若不识别,删除缓存 `plugins.dat` 并重建:
6770

0 commit comments

Comments
 (0)