【发布时间】:2023-03-30 14:00:01
【问题描述】:
我正在尝试将 C++ 中 ffmpeg 库中的 libavcodec 与 Visual Studio 2017 社区一起使用。我从 zeranoe(版本 20171217)下载了最新的 x64 开发和共享构建,在 Visual Studio 中为 x64 构建设置包含目录和其他库,将共享包中的 DLL 文件添加到我的 PATH。
这是我的示例测试代码:
extern "C" {
#include <libavcodec\avcodec.h>
}
int main() {
avcodec_register_all();
AVFrame *pAvFrame = av_frame_alloc();
av_frame_free(&pAvFrame);
return 0;
}
代码编译没有问题,但是当我运行应用程序时,我看到一个对话框窗口,错误消息“av_frame_alloc 的过程入口点无法位于 DLL 中”(实际消息不是英文,这是翻译版本) .
我尝试按照类似问题中的建议设置链接器->优化->对 /OPT:NOREF 的引用,但没有帮助。
Dependency walker 显示 av_frame_alloc 已导出,“入口点”未绑定。有点奇怪的是,av_frame_alloc 显示在 avcodec-58.dll(红色)和 avutil-56.dll(绿色)中。可能原因是应用程序试图从 avcodec 而不是 avutil 获取这个函数,但我不确定,因为我没有检查这些库的源代码。
那么问题是如何在VS2017中建立这样一个简单的基于FFMPEG的C++项目,我错在哪里?
UPD。 1.
链接器标志:/OUT:"C:\work\code\TestFfmpeg\x64\Release\TestFfmpeg.exe" /MANIFEST /NXCOMPAT /PDB:"C:\work\code\TestFfmpeg\x64\Release\TestFfmpeg. pdb" /DYNAMICBASE "c:\work\dev\ffmpeg-20171217-387ee1d-win64-dev\lib*.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32. lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG:FULL /MACHINE:X64 /OPT:NOREF / PGD:"C:\work\code\TestFfmpeg\x64\Release\TestFfmpeg.pgd" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"x64\Release\TestFfmpeg.exe.intermediate.manifest " /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1
【问题讨论】:
-
你的链接器标志是什么?
-
我在 VS2017 中为空项目使用默认设置(/OPT:NOREF 除外)。我将链接的标志添加到我的 qiestion 中,因为评论太长了
-
av_frame_alloc由 libavutil 提供(请参阅 libavutil/frame.c)。您是否链接到 libavutil? -
是的,avutil.lib链接到项目中,avutil-56.dll在路径中,由可执行文件加载(根据dependency walker)。
-
我最好的建议是在终端中运行相关的 cl.exe 命令或使用 MSVC 中的日志来确定您是否收到任何编译器或链接器警告或消息。我的猜测是它没有链接到与您正在加载的相同的 avutil,或者编译器找不到标头(或使用了错误的标头)...
标签: c++ ffmpeg windows-10 visual-studio-2017 avcodec