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

本文详细介绍了在使用VS2015编译cocos2d-x-3.6工程时遇到的四个主要错误:snprintf宏重定义、无法解析的外部符号__imp___vsnprintf、libpng.lib链接错误和error C2039。针对每个错误,文章给出了原因分析和解决方法,包括修改cocos2d源代码、添加链接器附加依赖项以及调整代码以适配VS2015的编译环境。

使用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 <iterator>

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值