Visual Studio 2015を使用してcocos2d-x(バージョン3.3)をコンパイルすると、次のようなエラーが発生しました。
致命的なエラーC1189:#error:snprintfのマクロ定義が標準ライブラリ関数宣言と競合します(編集译ソース文件..\base\s3tc.cpp)
ソースコードは次のとおりです。
#ifdef snprintf
#error Macro definition of snprintf conflicts with Standard Library
function declaration
#endif
誰が間違っているのか教えてもらえますか?
これまで、snprintf()
がサポートされていたため、多くのライブラリとプログラムは_snprintf()
関数を_snprintf()
として定義して使用していました。
_#define snprintf _snprintf
_
最後に、Visual Studio 14ではsnprintf()
!を定義しています。
以来、snprintf()
が公式にサポートされるようになりました。絶対に#defineしてはいけません。
これを行うと、stdio.hで定義された新しいsnprintf()
関数が覆い隠されます。
それを制限するために、これはstdio.hに追加されます
_#ifdef snprintf
#error: Macro definition of snprintf conflicts with Standard Library function declaration”
#endif
_
したがって、コードはコンパイルされません。
Visual Studioの以前のすべてのバージョンでは、_snprintf()
関数を使用する必要があるのは事実です。ただし、VS 2014以降では、_snprintf()
で#defineしないでください。
コードのどこか、またはcocos
ヘッダーにある可能性が高いため、これが行われたためエラーが発生しました。
それを確認して、その#defineを削除してください。
snprintf()
はC99仕様の一部です。
C99サポートを有効にするには
これをプログラムに追加してください
_#if _MSC_VER>=1900
# define STDC99
#endif
_
_MSC_VERマクロの値がわからない場合
_...
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
_
コードでsnprintf
の定義を見つけ、VS2015
で定義を解除します。
何かのようなもの:
#if _MSC_VER < 1900 //vs2015 already have this function
#define snprintf _snprintf_s
#endif
user1は正しい
しかし、この方法で問題を解決したとしても、ビルド済みライブラリのリンカーの問題に直面する可能性があります。
これを回避する方法は、すべてのプロジェクトのプラットフォームツールセットをVisual Studio 2013(v120)に変更することです
そして、リンカー/入力プロパティページで、特定のデフォルトライブラリを無視するためにlibcmt.libを追加します。libcmt.lib; libcmtd.lib; ...