问题
When I compile cocos2d-x (version 3.3) using visual studio 2015, an error occured, saying:
fatal error C1189: #error: Macro definition of snprintf conflicts with Standard Library function declaration (编译源文件 ..\base\s3tc.cpp)
The source code is:
#ifdef snprintf
#error Macro definition of snprintf conflicts with Standard Library
function declaration
#endif
Anybody can tell me what's wrong?
回答1:
Until now, Many libraries & programs used snprintf()
function by defining it as _snprintf()
, since _snprintf()
was supported.
#define snprintf _snprintf
Finally, Visual Studio 14 defines snprintf()
!
Since, snprintf()
is now officially supported. We should never #define it.
Doing it will overshadow new snprintf()
function defined in stdio.h.
To restrict that, this is added in stdio.h
#ifdef snprintf
#error: Macro definition of snprintf conflicts with Standard Library function declaration”
#endif
Hence, your code doesn't compile.
It is true that on all previous versions of Visual Studio, you must use _snprintf()
function. But VS 2014 onwards you should not #define it with _snprintf()
.
Somewhere in your code or most likely in cocos
headers, this is done and hence the error.
Check that and remove that #define.
snprintf()
is part of C99 specifications.
To enable C99 support
add this in your program
#if _MSC_VER>=1900
# define STDC99
#endif
In case you don't know what _MSC_VER macro values are
...
MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)
MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)
MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008)
MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005)
MSVC++ 7.1 _MSC_VER == 1310 (Visual Studio .NET 2003)
MSVC++ 7.0 _MSC_VER == 1300
MSVC++ 6.0 _MSC_VER == 1200
MSVC++ 5.0 _MSC_VER == 1100
MSVC++ 4.0 _MSC_VER == 1000
MSVC++ 2.0 _MSC_VER == 900
MSVC++ 1.0 _MSC_VER == 800
C/C++ 7.0 _MSC_VER == 700
C 6.0 _MSC_VER == 600
回答2:
Just find the definition of snprintf
in your code and undefine it while on VS2015
.
Something like:
#if _MSC_VER < 1900 //vs2015 already have this function
#define snprintf _snprintf_s
#endif
回答3:
user1 is right
But even if you fix the problem this way, you'll probably face linker problems with prebuilt libraries.
The way to avoid this is to change platform toolset on all projects to Visual Studio 2013 (v120)
And in linker/input propry page add libcmt.lib to Ignore Specific Default libraries: libcmt.lib;libcmtd.lib;...
来源:https://stackoverflow.com/questions/27754492/vs-2015-compiling-cocos2d-x-3-3-error-fatal-error-c1189-error-macro-definiti