web-dev-qa-db-ja.com

VS 2015のコンパイルcocos2d-x 3.3エ​​ラー「致命的なエラーC1189:#error:snprintfのマクロ定義が標準ライブラリ関数宣言と競合しています」

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

誰が間違っているのか教えてもらえますか?

36
Jared

これまで、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
_
61
user1

コードでsnprintfの定義を見つけ、VS2015で定義を解除します。
何かのようなもの:

#if _MSC_VER < 1900 //vs2015 already have this function
#define snprintf _snprintf_s 
#endif
4
Jie

user1は正しい

しかし、この方法で問題を解決したとしても、ビルド済みライブラリのリンカーの問題に直面する可能性があります。

これを回避する方法は、すべてのプロジェクトのプラットフォームツールセットをVisual Studio 2013(v120)に変更することです

そして、リンカー/入力プロパティページで、特定のデフォルトライブラリを無視するためにlibcmt.libを追加します。libcmt.lib; libcmtd.lib; ...

3
user1185287