如何使用 MSVC 编译 2005 年的 .dll 文件?

How can I compile a .dll file from 2005 with MSVC?

我需要编译旧版本的 lame_enc.dll(MP3 编码器,版本 3.97)。

单向迁移到 Visual Studio 2019 报告可能需要更改代码才能正确创建项目。尝试编译 DLL 时,出现多个警告和以下错误。

C1189   #error:  Macro definition of snprintf conflicts with Standard Library function declaration  libmp3lame  C:\Program Files (x86)\Windows Kits\Include.0.18362.0\ucrt\stdio.h    1935

LNK1181 Cannot open Input file "C:\Users\*\Desktop\lame-3.97\libmp3lame\Debug\libmp3lame.lib".  LameMp3EncDll   C:\Users\*\OneDrive\Desktop\lame-3.97\Dll\LINK  1   

2019 年、2015 年和 2010 年的 MSBuild 和 Devenv 都导致了同样的错误。

C:\Program Files (x86)\Windows Kits\Include.0.18362.0\ucrt\stdio.h(1935,1): fatal error C1189: #error:  Macro definition of snprintf conflicts with Standard Library function declaration [C:\Users\*\Desktop\lame-3.97\libmp3lame\libmp3lame_vc7.vcxproj]

This 是我正在使用的确切版本和文件。

编译dll需要什么use/do?

What do I need to use/do to compile the dll?

Visual Studio 14+在stdio.h.

中定义snprintf_snprintf

解决方案

1) 运行 VS2019 as Administrator 然后重新打开你的项目

2) 请在 stdio.h 文件中更改这些:

 #if defined snprintf
 .....
 #endif

#if _MSC_VER < 1900
#  define snprintf _snprintf
#endif

3) Edit-->Find and Replace-->Find in Files-->

查找内容: #\s*define\s+snprintf

查看:整个解决方案(包括外部项目)

选择Match caseUse Regular Expressions

所以请将#define snprintf _snprintf改为:

#if _MSC_VER < 1900
#  define snprintf _snprintf
#endif

注意:在id3tag.c文件中更改这些

改变

#ifdef _MSC_VER
#define snprintf _snprintf
#endif

至:

#if _MSC_VER < 1900
#  define snprintf _snprintf
#endif

更新 1

libmp3lame项目是一个class库项目,我们不能直接调试lib项目,方法是我们应该运行一个可执行项目(xxx.exe)然后引用这个lib,之后我们就可以调试了。参见

我发现 lame 项目是一个可执行项目,我认为它已经引用了 libmp3lame.lib,所以你应该先将其更改为启动项目,然后右键单击该项目-- >properties-->Linker-->General-->change Output File to $(OutDir)$(TargetName)$(TargetExt).

创建一个新的可执行项目然后引用libmp3lame.lib。如何引用lib可以参考this.