小熊猫C++使用中的常见问题及其解答
编译器相关
小熊猫C++中每个编译器有Debug和Release两个配置集,有何区别?
配置类型 | 作用 |
---|---|
Release | 生成优化、静态链接的可执行文件。其执行速度最快,可以脱离gcc环境独立运行 |
Debug | 生成调试用的可执行文件;其中包含了调试信息和符号,运行速度相对较慢;脱离gcc环境运行时会提示缺少dll文件 |
MinGW-w64官方的版本只有8.1,为什么小熊猫C++自带的MinGW-w64 GCC版本是11.2 / 13.1?
首先必须需要说明,MinGW-w64和GCC是两回事:GCC是一个C/C++编译器,而MinGW / MinGW-w64是windows系统下的C/C++基本运行函数库。
截止2022年5月,GCC的官方网站上发布的GCC最新版本已经是12.1; MinGW-w64官方日志中发布的MinGW-w64的最新版本是10.0.0。
小熊猫C++ 1.0.6带的gcc编译器版本是基于MinGW-w64库的GCC 11.2。
网上流传比较广的MinGW-w64 gcc 8.1实际的版本号是gcc 8.1和MinGW-w64 6.0,它来源于MingW-W64-builds网站,该网站提供了mingw-w64库的最新版本,但并未提供最新的基于MinGW-w64的GCC编译器。如果想在windows下使用最新的mingw-w64库和gcc编译器,可以考虑安装MSYS2。
小熊猫C++自带的MinGW-w64 GCC是哪儿来的?为什么不使用MSYS2版本?
2.22版前小熊猫C++自带的MinGW-w64 GCC(包括32位和64位)均来自于Qt wiki
2.23版之后小熊猫C++自带的MinGW-w64 GCC 13.1来自于mingw builds,并做了如下改动:
- 修正binutils的bug https://github.com/niXman/mingw-builds/issues/649
- 继续使用来自以前版本gcc的gdb 10.2
之所以不使用MSYS2版本的MinGW-w64 GCC编译器,是因为它的gdb编译器存在bug,当所在文件夹的完整路径中包含非ascii字符时,会无法启动。这会导致小熊猫C++无法调试程序。而qt版本的gcc编译不存在这个问题。
小熊猫C++自带的Clang编译器是哪儿来的?
由于clang只支持gbk编码,在中文windows下处理中文输入非常麻烦,不利于初学者和教学使用,所以从小熊猫C++ 1.1.2版本开始不再自带clang编译器。有兴趣的用户可以自行从LLVM MinGW下载最新版的clang编译器。
小熊猫C++自带的Clang编译器来自于MSYS2。是的,这个版本的gdb同样存在当所在文件夹的完整路径中包含非ascii字符时,无法启动的bug。但这已经是目前为止作者在网上能找到的最好的可独立使用的Clang编译器发行版了。
Clang编译器和GCC编译器有啥区别?如何选择?
GCC是一个久经考验的开源C/C++编译器,大多数编程竞赛和OJ(网上判题)网站都在后台使用这个编译器。和Clang相比,它的优点是:
- 支持文件的字符编码转码操作。在小熊猫C++中用它编译的程序里可以直接用printf或者cout输出中文字符串,而基本不用担心乱码问题。
- 遇到问题时在网上比较容易找到相关的解答。
Clang是相对较新的开源C/C++编译器。它的优点是:
- 提供比gcc更直观友好的错误提示信息
- 支持-fsanitize=address参数,编译出的程序在检测到内存/数组访问越界行为时会自动提示并退出。
缺点是:
- 不支持文件的字符编码转码操作。容易遇到中文乱码问题
所以,对于自学C/C++,或者不太容易获得教师答疑的用户来说,建议使用GCC编译器。
项目相关
windows下,项目全部重新编译时显示“clean Error 127 (ignored)”
请检查系统环境变量PATH里的文件夹中是否存在sh.exe文件。将其改名或者移除即可。
错误原因: 小熊猫C++构建项目使用的mingw32-make会优先运行PATH中的sh.exe,然后再查找del程序。而del是windows系统控制台程序cmd.exe自带的命令,sh无法找到它,因此会出现Error 127找不到命令错误。
Clang相关
如何让用Clang编译的程序正确显示中文
使用wchar_t字符串代替char字符串。参考下面的c程序(在cpp程序中应使用wcout代替cout)
**注意:由于MinGW-w64中stdlib的bug,该程序使用gcc编译时运行结果乱码
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main() {
wchar_t msg[200];
wchar_t name[100];
// 将程序的Locale设为简体中文,这一步很重要
setlocale(LC_ALL,"zh_CN");
wprintf(L"你叫什么?");
wscanf(L"%ls",name);
wcscpy(msg,L"你好,");
wcscat(msg,name);
wprintf(L"%ls\n",msg);
return 0;
}
如何让用Clang编译的ege程序正确显示中文
使用wchar_t字符串代替char字符串。参考下面的c程序
#include <graphics.h>
#include <wtypes.h>
#include <locale.h>
#define BUF_SIZE 4096
int main() {
wchar_t buf[BUF_SIZE+1];
initgraph(640,480);
inputbox_getline(L"名字",L"名字",buf,BUF_SIZE);
xyprintf(200,200,L"你好!%ls",buf);
getch();
return 0;
}