decoding_encoding.c 在VS下调试错误总结
2015-05-10 00:13
260 查看
新建的C++工程
error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> d:\microsoft visual studio 11.0\vc\include\stdio.h(218) : 参见“fopen”的声明
解决:工程属性页|配置属性|C/C++|预处理器|预处理器定义|编辑添加“_CRT_SECURE_NO_WARNINGS”
error C2440: “=”: 无法从“void *”转换为“uint16_t *”
1> 从“void*”到指向非“void”的指针的转换要求显式类型转换
解决:samples = (uint16_t *)av_malloc(buffer_size);
“avcodec_find_encoder”: 不能将参数 1 从“int”转换为“AVCodecID”
1> 转换为枚举类型要求显式转换(static_cast、C 样式转换或函数样式转换)
解决:codec = avcodec_find_encoder((enum AVCodecID)codec_id);
error C2059: 语法错误:“{”
error C2143: 语法错误 : 缺少“;”(在“{”的前面)
error C2143: 语法错误 : 缺少“;”(在“}”的前面)
以上三条指的是c->time_base = (AVRational){1,25};的语法错误,标准C++不支持这种语法。
解决:c->time_base.num = 1; c->time_base.den = 25;
error C3861: “snprintf”: 找不到标识符
解决:snprintf函数并不是标准c/c++中规定的函数,但是在许多编译器中,厂商提供了其实现的版本。
error C2440: “=”: 无法从“_TCHAR *”转换为“const char *”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
解决:output_type = (const char *)argv[1];
特别注意:这里单字节字符编码(C语言是ASCII)和双字节字符编码不匹配,有以下解决方法
法1:项目属性|配置属性|常规|项目默认值|字符集|使用 Unicode 字符集->使用多字节字符集
法2:可以把 int _tmain(int argc, _TCHAR* argv[]) 改为 C 文件中的 int main(int argc, char **argv),统一为单字节字符编码。
法3:const char *output_type; -> const _TCHAR *output_type;
output_type = argv[1]; -> output_type = (const_TCHAR *)argv[1];
这样就统一都为双字节的。字符串比较函数用wcscmp()替换strcmp(),这样就可以比较宽字符。
解决:下载的64位的库,平台是默认设置Win32,设置成x64就行了。
值得说明的是,
\Windows\SysWOW64 文件夹下存放32位的库和应用程序 (WOW64 == Windows on Windows 64 bit );
\Windows\System32 文件夹下存放64位的库和应用程序。不要被名字迷惑了。
error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> d:\microsoft visual studio 11.0\vc\include\stdio.h(218) : 参见“fopen”的声明
解决:工程属性页|配置属性|C/C++|预处理器|预处理器定义|编辑添加“_CRT_SECURE_NO_WARNINGS”
error C2440: “=”: 无法从“void *”转换为“uint16_t *”
1> 从“void*”到指向非“void”的指针的转换要求显式类型转换
解决:samples = (uint16_t *)av_malloc(buffer_size);
“avcodec_find_encoder”: 不能将参数 1 从“int”转换为“AVCodecID”
1> 转换为枚举类型要求显式转换(static_cast、C 样式转换或函数样式转换)
解决:codec = avcodec_find_encoder((enum AVCodecID)codec_id);
error C2059: 语法错误:“{”
error C2143: 语法错误 : 缺少“;”(在“{”的前面)
error C2143: 语法错误 : 缺少“;”(在“}”的前面)
以上三条指的是c->time_base = (AVRational){1,25};的语法错误,标准C++不支持这种语法。
解决:c->time_base.num = 1; c->time_base.den = 25;
error C3861: “snprintf”: 找不到标识符
解决:snprintf函数并不是标准c/c++中规定的函数,但是在许多编译器中,厂商提供了其实现的版本。
在gcc中,该函数名称就snprintf,而在VC中称为_snprintf。 改成_snprintf就可以了
error C2440: “=”: 无法从“_TCHAR *”转换为“const char *”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
解决:output_type = (const char *)argv[1];
特别注意:这里单字节字符编码(C语言是ASCII)和双字节字符编码不匹配,有以下解决方法
法1:项目属性|配置属性|常规|项目默认值|字符集|使用 Unicode 字符集->使用多字节字符集
法2:可以把 int _tmain(int argc, _TCHAR* argv[]) 改为 C 文件中的 int main(int argc, char **argv),统一为单字节字符编码。
法3:const char *output_type; -> const _TCHAR *output_type;
output_type = argv[1]; -> output_type = (const_TCHAR *)argv[1];
这样就统一都为双字节的。字符串比较函数用wcscmp()替换strcmp(),这样就可以比较宽字符。
解决:下载的64位的库,平台是默认设置Win32,设置成x64就行了。
值得说明的是,
\Windows\SysWOW64 文件夹下存放32位的库和应用程序 (WOW64 == Windows on Windows 64 bit );
\Windows\System32 文件夹下存放64位的库和应用程序。不要被名字迷惑了。
相关文章推荐
- demuxing_decoding.cpp 在VS下调试错误总结
- VS.NET调试 ASP.NET出现的常见错误总结
- VS.NET调试 ASP.NET出现的常见错误总结
- 关于vs2013调试的偶然错误发现与总结(vs2013的承载进程)---ShinePans
- 关于vs2013调试的偶然错误发现与总结(vs2013的承载进程)---ShinePans
- VS2015 程序运行调试错误总结
- vs.net调试asp.net常见问题总结
- 错误总结:C/C++运行时提示".exe已停止工作"? 调试时出现Program received signal SIGSEGV,Segmentation fault?引用无效内存一般是什么错误?
- 第7章 调试和错误处理 7.1.1 VS中的调试
- 【错误集锦】VS按调试老是提示“项目已经过期”
- 关于WIN10 VS2015下调试DirectX11 DEMO错误的解决方案
- OpenAL+VS2013配置过程及常见错误总结
- VS调试STL问题总结
- 调试经验总结-VC下的错误对话框
- VS.NET调试.NET出现的常见错误 (转载)
- VS2017 Asp.net MVC SqliteEF6 调试错误列表
- 【vs调试】C/C++ 错误处理(文档):未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
- 调试经验总结-VC下的错误对话框
- VS调试时监视上一个错误代码和错误的文本描述
- 在VS调试的时候出现如下错误,生成下面的模块时,启用了优化或没有调试信息;