VS2015编译AV1编码器源码遇LNK2019链接错误求助
我之前在VS2015里折腾AV1编码器源码的时候也碰到过几乎一模一样的问题,给你几个我亲测有效的解决方向:
检查运行库编译选项一致性
这个是最常见的原因:aomdec.lib的编译运行库选项和你的exe项目不匹配。标准库函数在静态(MT/MTd)和动态(MD/MDd)编译模式下的符号名称完全不同,动态模式下会带__imp__前缀,静态模式则没有。
操作步骤:右键exe项目 → 属性 → 配置属性 → C/C++ → 代码生成 → 运行库,确保这里的选项和编译aomdec.lib时的选项完全一致(要么都是/MT(Release)//MTd(Debug),要么都是/MD//MDd)。手动添加标准库依赖
有时候VS的默认配置会漏掉标准库的链接,你可以手动指定:
右键exe项目 → 属性 → 配置属性 → 链接器 → 输入 → 附加依赖项,添加对应的库:- 如果用动态运行库(MD/MDd):添加
msvcrt.lib - 如果用静态运行库(MT/MTd):添加
libcmt.lib
也可以直接在exe项目的主源码文件开头加一行#pragma comment(lib, "msvcrt.lib")(对应MD)或者#pragma comment(lib, "libcmt.lib")(对应MT),强制链接对应库。
- 如果用动态运行库(MD/MDd):添加
检查源码中的头文件与宏定义
看看_file_is_obu所在的源文件有没有正确包含<stdio.h>,有时候漏加头文件会导致函数声明不完整,触发链接错误。另外,AV1源码可能依赖Windows平台的特定宏,比如_CRT_SECURE_NO_WARNINGS,你可以在项目的预处理器定义里加上这个宏(右键项目 → 属性 → 配置属性 → C/C++ → 预处理器 → 预处理器定义)。确认平台位数匹配
确保aomdec.lib的编译平台(x86/x64)和你的exe项目完全一致。如果库是32位的,但你编译64位exe,也会出现这类符号找不到的错误。检查项目属性里的“平台”选项,和编译库时的平台对齐。
如果以上方法都不行,建议重新编译aomdec.lib,严格按照你当前exe项目的配置来选运行库、平台位数,这样能从根源上避免不兼容的问题。
内容的提问来源于stack exchange,提问作者Ghansham

