跳至正文

使用VS2015编译cocos2d-x-3.6工程报错的解决

  • Cocos

使用VS2015编译cocos2d-x-3.6引擎的cpp-tests工程,首先报错的是libcocos2d模块,错误如下:

1、错误:snprintf宏重定义:#error: Macro definition of snprintf conflicts

原因

在VS2015前,Windows系统头文件并没有定义snprintf宏,所以cocos2d在CCStdC-win32.h文件做了如下定义

#define snprintf _snprintf

而VS2015开始在系统头文件中又定义了snprintf宏,所以就出现了重定义冲突。

解决

在cocos2d的CCStdC-win32.h文件中注释以下这行,如下:

//#define snprintf _snprintf

继续编译,报错:

2、错误:无法解析的外部符号 __imp___vsnprintf

原因

vs2015默认编译时将许多标准库采用内联方式处理,因而没有可以链接的标准库文件,所以要专门添加标准库文件来链接标准库中的函数。

解决

在vs2015工程选项,链接器附加依赖项里面添加 legacy_stdio_definitions.lib 即可,如下图所示:

继续编译,报错:

3、错误:libpng.lib(pngerror.obj) : error LNK2019: 无法解析的外部符号 __imp____iob_func

原因

当前的 libpng.lib 是旧版本编译的,而VS2015把 __iob_func 改成了 __acrt_iob_func,所以出现不一致错误,因此可在工程任意一个cpp文件中增加了一个名为 __iob_func 的转换函数,代码如下:

/*
* 如果lib是用vs2015编译的,则不需要此定义
*/
#if _MSC_VER>=1900
#include "stdio.h" 
_ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);
#ifdef __cplusplus 
extern "C"
#endif 
FILE* __cdecl __iob_func(unsigned i) {
    return __acrt_iob_func(i);
}
#endif /* _MSC_VER>=1900 */

继续编译,报错:

4、错误:error C2039: “back_inserter”: 不是“std”的成员

原因

VS2015需要对std标准库单独声明

解决

在出错的cpp文件头部加上这句

#include 

再次编译,libcocos2d库应该能编译成功了,如果之后生成cpp-tests工程时出现相同错误,则按上面方法照样修改。

标签:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注