debugging - 在 Windows 10 上使用 vcpkg 构建 ffmpeg:如何在可执行文件中保留符号?
问题描述
我正在 Windows 10 上构建 ffmpeg 源代码,以尝试自定义并将这个开源包合并为更大包的一部分。因为 ffmpeg 是一个以 Linux 为中心的代码库,所以我使用 MSYS2 平台来构建我的 Windows 可执行文件。对于这些可执行文件,我需要能够单步执行代码,因此我需要一个包含符号的 ffmpeg 版本。按照惯例,ffmpeg 项目为每个可执行文件构建两个版本,ffmpeg 和 ffmpeg_g。后者(ffmpeg_g)保留符号,而前者被剥离。我选择 vcpkg 工具集作为下载必要软件包和构建 Windows 格式所需可执行文件的最直接方式。不幸的是,vcpkg 构建过程为 ffmpeg 和 ffmpeg_g 创建了两个相同的可执行文件,它们都不包含符号。
这是我的过程:安装 msys2-x86_64-20210725.exe
在我的系统上克隆 vcpkg 的 git 存储库:
git clone https://github.com/microsoft/vcpkg
cd vcpkg
现在我使用 vcpkg 根据以下说明在 vcpkg\install 安装和构建源代码(版本 X): https ://trac.ffmpeg.org/wiki/CompilationGuide/vcpkg
然后我使用以下参数调用 vcpkg。
./vcpkg install ffmpeg[core,avcodec,avdevice,avfilter,avformat,ffmpeg,ffplay,ffprobe,nvcodec,opencl,postproc,sdl2,swscale,nonfree]:x64-windows --recurse
它成功地构建了 ffmpeg.exe 和相关的可执行文件,以及必要的 DLL。构建日志的摘录显示以下内容:
Creating library libavdevice/avdevice.lib and object libavdevice/avdevice.exp
LD ffmpeg_g.exe
LD ffplay_g.exe
LD ffprobe_g.exe
CP ffmpeg.exe
CP ffplay.exe
CP ffprobe.exe
STRIP ffmpeg.exe
skipping strip ffmpeg.exe
STRIP ffprobe.exe
skipping strip ffprobe.exe
STRIP ffplay.exe
skipping strip ffplay.exe
这不仅意味着脚本不会剥离“_g”文件,而且符号剥离以某种方式被禁用。然而,当我进入文件夹 vcpkg\buildtrees\ffmpeg\x64-windows-dbg 并输入“ls ffmpeg*.exe”时,它告诉我 ffmpeg 和 ffmpeg_g 可执行文件的大小相同。果然,当我输入命令“gdb ffmpeg_g.exe”时,它给了我警告:
Reading symbols from ffmpeg_g.exe...
(No debugging symbols found in ffmpeg_g.exe)
我的印象是默认情况下应该生成和保留符号,但显然情况并非如此。是否有一些编译器或链接器选项可以传递给 vcpkg,以便创建包含符号的可执行文件?还是我做错了什么?
解决方案
推荐阅读
- vba - 查找打开的 PowerShell 窗口的“位置”
- java - 从 Fragment 移动到 Activity 导致 android.os.TransactionTooLargeException
- laravel - 使用 alpine js 在选择更改时初始化 select2
- leaflet - 在 Leaflet 中的多边形中心设置标记
- javascript - 查询 Ajax JavaScript 下拉绑定数据 Codeigniter
- docker - oauth2-proxy:本地设置拒绝连接
- d3.js - d3JS云图:避免重叠词
- python - 保存到文件时在远程服务器上运行的 Python 代码失败并出现 OSError,尽管在代码的早期成功保存到同一位置
- genexus - 如何让 GAM 会话保持活跃?
- reporting-services - 如何格式化没有符号的负数