如何用MSVC编译2005版DLL?Lame_enc.dll 3.97编译报错求助
解决LAME 3.97在Visual Studio 2019编译lame_enc.dll的问题
我来帮你一步步拆解并解决这些编译问题,以及最后关于用MSVC编译2005版DLL的需求:
一、解决C1189: snprintf宏冲突错误
这个错误是因为LAME 3.97的旧代码里自定义了snprintf宏,而新版Windows SDK(UCRT)已经提供了标准的snprintf函数,两者定义冲突导致的。解决步骤如下:
- 打开LAME源码目录下的
libmp3lame文件夹,找到compat.h文件(部分版本可能在stdio.h中)。 - 查找类似以下的宏定义代码:
#define snprintf _snprintf - 把这个宏定义注释掉,或者改成条件编译,只在不支持标准
snprintf的旧环境下生效。比如修改为:
(#if !defined(_MSC_VER) || _MSC_VER < 1900 #define snprintf _snprintf #endif_MSC_VER < 1900对应VS2013及更早版本,VS2015及之后的版本原生支持标准snprintf) - 保存文件后重新编译
libmp3lame项目,这个错误就会消失。
二、解决LNK1181: 无法打开libmp3lame.lib错误
这个错误的核心是libmp3lame项目没有成功编译,导致生成不了对应的库文件,进而让LameMp3EncDll项目链接失败。解决步骤:
- 先确保已经解决了上面的snprintf冲突问题,成功编译出
libmp3lame.lib文件。 - 检查项目依赖设置:
- 在VS2019中右键点击
LameMp3EncDll项目,选择「项目依赖」。 - 勾选
libmp3lame项目,让VS优先编译库项目再编译DLL项目。
- 在VS2019中右键点击
- 验证链接器输入路径:
- 右键
LameMp3EncDll项目 → 属性 → 链接器 → 输入 → 附加依赖项,确保libmp3lame.lib的路径正确(如果是同一解决方案下的项目,直接写libmp3lame.lib即可,VS会自动找到生成的文件)。
- 右键
- 清理整个解决方案后重新生成,就能正常找到库文件完成链接了。
三、如何用MSVC编译2005版的.dll文件
如果需要生成兼容VS2005的DLL,有两种可行方式:
方法1:直接使用VS2005编译
- 安装Visual Studio 2005(需找到对应安装包),直接打开LAME 3.97自带的VS2005项目文件,编译即可生成对应版本的DLL。
方法2:在高版本VS(如2019)中使用VS2005工具链
- 首先,在VS2019的安装程序中,勾选「单个组件」里的「Visual C++ 2005工具集」(通常在「旧工具和软件」分类下)。
- 打开LAME项目后,右键项目 → 属性 → 常规 → 平台工具集,选择「v80 - Visual Studio 2005」。
- 调整运行时库设置:属性 → C/C++ → 代码生成 → 运行时库,选择VS2005支持的选项(比如
多线程调试(/MTd)或多线程(/MT),避免高版本专属选项)。 - 若遇到SDK相关错误,可在属性 → 常规 → Windows SDK版本中选择旧版本SDK(如Windows XP兼容SDK)。
- 最后重新编译项目,就能生成兼容VS2005的DLL了。
内容的提问来源于stack exchange,提问作者Jogius




