为什么有些延迟加载 DLL 会立即使用 FFMPEG 卸载?
Why are some delay load DLLs immediately unloaded with FFMPEG?
我已经将ffmpeg构建为DLL并将它们链接到我的应用程序,当DLL位于可执行文件文件夹中时,该应用程序运行良好。 因为我想为不同的项目配置加载不同的 ffmpeg 版本,所以我需要将它们放在与.exe不同的文件夹中(即"/bin/ffmpeg/config1"、"/bin/ffmpeg/config2"等(。 我知道如何在不修改环境 PATH 的情况下执行此操作的唯一方法是将 DLL 标记为"延迟加载",然后在启动时通过 LoadLibrary 调用指定完整路径。
这适用于其他 DLL,但对于 FFMPEG,我无法使其正常工作。
我已经在我的 vcxproj 中指定了 DLL 到 DelayLoad(实际上是在链接的 .props 文件中(:
<DelayLoadDLLs>
avcodec-58.dll;avutil-56.dll;avformat-58.dll;swscale-5.dll;swresample-3.dll;
</DelayLoadDLLs>
在启动时,我通过 LoadLibrary 加载它们:
LoadLibraryA("ffmpeg\config1\avcodec-58.dll");
LoadLibraryA("ffmpeg\config1\avutil-56.dll");
LoadLibraryA("ffmpeg\config1\avformat-58.dll");
LoadLibraryA("ffmpeg\config1\swscale-5.dll");
LoadLibraryA("ffmpeg\config1\swresample-3.dll");
奇怪的是,当我进行 LoadLibrary 调用时,它似乎正在加载它们,然后立即卸载其中一些:
'ffmpegtest.exe' (Win32): Loaded 'C:ffmpegtestbinffmpegmediumavcodec-58.dll'. Symbols loaded.
'ffmpegtest.exe' (Win32): Unloaded 'C:ffmpegtestbinffmpegmediumavcodec-58.dll'
'ffmpegtest.exe' (Win32): Loaded 'C:ffmpegtestbinffmpegmediumavutil-56.dll'. Symbols loaded.
'ffmpegtest.exe' (Win32): Loaded 'C:ffmpegtestbinffmpegmediumavformat-58.dll'. Symbols loaded.
'ffmpegtest.exe' (Win32): Unloaded 'C:ffmpegtestbinffmpegmediumavformat-58.dll'
'ffmpegtest.exe' (Win32): Loaded 'C:ffmpegtestbinffmpegmediumswscale-5.dll'. Symbols loaded.
'ffmpegtest.exe' (Win32): Loaded 'C:ffmpegtestbinffmpegmediumswresample-3.dll'. Symbols loaded.
因此,问题似乎肯定在于它选择卸载某些dll的事实。 如果我根本不包含对 LoadLibrary 的任何调用,那么我在调用这些库的第一行代码中就会崩溃,avutil-56.dll 中的一个函数。 如果我包含对 LoadLibrary 的调用,那么前几个函数调用就会成功,然后我们在对卸载库的第一次调用中崩溃,特别是 avcodec-58.dll 中的"av_codec_iterate(("。 如果我将卸载的 DLL 复制到可执行文件文件夹,那么一切正常。
为什么会卸载某些 DLL? 我该如何预防它?
我不知道这是否是手头的问题,但昨天同样的行为发生在我身上。
事实证明,这是一个架构不匹配:我的程序是x64,DLL是用x86编译的。
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 如何用RISC-V GD32VF103CBT6开发板卸载精确的ADC过采样
- 无法使用加载库卸载注入的 dll (C++)
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 为什么有些延迟加载 DLL 会立即使用 FFMPEG 卸载?
- 如何根据 DLL 端的请求卸载 DLL 模块以卸载它?
- 通知 Windows 系统应用程序字体已被卸载/删除
- 如何从目标进程卸载 DLL?
- 用于 OpenMP 4.5 卸载到 (GPU) 设备的 NVPTX GCC (9.0.0/trunk) 找不到 libg
- 卸载共享对象(.so 文件)在 C++ 中用 dlopen() 打开
- 按名称问题获取卸载应用程序路径
- 英特尔C++编译器 19.0 测试版中删除了对英特尔®图形技术的卸载支持
- libcoi_device.so.0 未找到英特尔 19.0.4 OpenMP 5.0 卸载编译错误
- OpenMP卸载到Nvidia错误还原
- 如何正确卸载DLL本身
- 卸载自身的 Linux 共享库
- 如何在Ubuntu 16.04中卸载PCL1.7
- cuda错误Cudart卸载(错误29)由于"driver shutting down"
- 安卓文件系统挂载/卸载通知