在Windows上的Visual Studio Code中配置C/C++运行环境

虽然在Windows上写C++程序首推Visual Studio,但是如果想要方便地运行代码片段或者编译单个文件的话,Visual Studio Code仍然是一个好选择。

首先去扩展商店中搜索并安装“C/C++”以及“Code Runner”。安装好了之后点击重新加载,以使插件生效。

Code Runner只是一个快捷运行代码的工具,我们需要准备一个编译器。如果已经安装有Visual Studio的C/C++桌面开发相关组件的话,MSVC应该是可以直接用的(只想安装VS 2017单独的C/C++工具链的话,也需要从官网下载VS的安装程序,然后只勾选必要项即可)。mingw或者WSL中的g++、Clang之类的也可以,看个人喜好。接下来以MSVC为例,配置Code Runner的命令行参数。

点击文件-首选项-设置,找到扩展标签下的Run Code configuration,修改Executor Map项(需要手动编辑JSON文件)。

fig1

settings.json分为左右两个窗格。左边是默认设置,右边是用户/工作区设置。我们在右边新增同名的键,以覆盖左边的默认值。

以命令行方式使用MSVC(cl.exe)需要配置环境变量。最简单的方式是运行VS的开发人员命令提示符脚本,它的位置可以在开始菜单里找到。

可以直接按照上面的样子配置。VsDevCmd.bat会设置相关环境变量等,然后直接cd到当前文件所在目录,调用cl即可。

配置好了之后,保存settings.json,打开一个C/C++源文件,按下F1打开命令窗口,输入Run,找到Run Code命令,运行之:

fig2

编译运行后应该能看到如下界面:

fig3

看起来一切顺利,但是还有问题:MSVC输出的中文会变成乱码。随便拿掉一个语句分号再编译,就会发现这一点。原因在于Code Runner使用管道重定向了命令输出,然后将其作为UTF-8文本显示。这在Linux下似乎没有大问题,然而由于历史原因,多数Windows下的命令行工具使用的是本机编码(GBK)。如果Locale配置无误的话,常用字符的显示在Windows终端下倒是没问题。但是我们这种情况就比较麻烦了,因为如果直接运行cl这类程序的话,它们的MBCS字符输出会被系统的ANSI系API正确处理,然后打到屏幕上;但是这里Code Runner面临的是未经处理的字节流,而它……看什么都觉得是UTF-8。虽然我们也可以通过调整code-runner.runInTerminal设置,让命令直接在终端里运行,但是比较彻底的方式是让cl直接输出UTF-8文本,或者……帮它输出。

写一个Wrapper对于熟悉Win32编程的读者来说应该不难:

稍微需要注意的是,由于GBK编码是变长的,所以当收到的第一个字节的最高位为1时,要等待第二个字节到来,再进行转换;由于我们的程序是要被Code Runner重定向STDOUT到匿名管道的,所以我们自己写控制台时就不能使用WriteConsole了,而应该使用通用的WriteFile。

编译好了之后,将这个程序命名为GBKWrapper.exe,然后丢到随便一个%PATH%内的目录即可。

要利用这个程序,只需要修改一下编译命令行:

在cl前面加上GBKWrapper,就可以看到中文的编译器输出了:

fig4

细心的读者可能看到了cl编译器选项的/utf-8。由于VSCode默认的UTF-8是不带BOM的,因此会被cl识别为当前本机编码(GBK)的文件。设置/source-charset:utf-8即可解决这个问题。/utf-8会同时设定source charset和execution charset,所以普通的字符(串)字面值也会变成UTF-8(当然,可以用前缀控制字面值编码,比如u8、u和U)。

IIS+WordPress HTTP 500错误及乱码解决方法

最近尝试把站点搬到了Windows上,结果出现了各种各样的问题:先是安装Wordpress时无缘无故出现HTTP 500,之后带有中文固定链接的文章又全部404,上传文件和安装主题等操作时也会引发HTTP 500,经过好一番折腾之后终于搞定了。

首先,去微软官网下载安装IIS用的URL Rewrite组件,重启IIS后可以设置URL重写规则。Apache的htaccess重写规则可以直接导入,但是不支持RewriteBase等指令。

然后确认一下PHP.ini的配置项
default_charset设置为UTF-8,其他encoding参数留空或者设置为UTF-8
mbstring.encoding_translation关闭

然后找到网站目录,在安全选项卡中赋予IUSR写入权限,否则Wordpress不能安装。

安装好之后如果希望固定链接能正常工作,需要修改wp-includes/class-wp.php,将parse_request函数中的

修改为

如图所示

接下来Wordpress页面应该能正常工作了。
但是会发现仍然不能上传文件,以及安装主题、插件等,均提示HTTP 500错误。原因是PHP默认的上传临时目录为TEMP文件夹,而IUSR对这个目录没有写入权限。我建议直接修改PHP的上传临时目录,在wwwroot下新建一个temp文件夹即可。

此时偶尔还是会在安装主题、插件时出现偶发的HTTP 500错误,其实这些都是虚假的警告。CGI程序在标准错误输出中写入内容时会被IIS判定为执行失败,返回500页面,实际上这些都是PHP输出的警告信息。我们需要修改IIS的CGI设置。


将标准错误模式设置为IgnoreAndReturn200即可。

我还遇到过一个问题,访问网站的PHP页面时出现类似下面的提示:

HTTP 错误 500.19 – Internal Server Error
无法访问请求的页面,因为该页的相关配置数据无效。
通知 ExecuteRequestHandler
处理程序 StaticFile
错误代码 0x800700b7
配置错误在唯一密钥属性“value”设置为“index.php”时,无法添加类型为“add”的重复集合项
原因是webconfig配置冲突,IIS中的配置有主机-网站-目录三个层次,在配置CGI程序和其他全局设置的时候应该在主机层级上设置,这样可以避免配置文件冲突的问题。

关于字符编码的问题,中文系统下URL Rewrite模块重写后的编码会变为GBK,我曾经尝试过打开mbstring.encoding_translation,将http_input设置为GBK,但是发布文章等场合的内容也全部变成了乱码。其实只要在class-wp中利用iconv转换一下就可以了。

 

使用环境:
Windows Server 2012 R2 Datacenter (64-bit)
Internet Information Services 8.5
PHP 5.6.7 (32-bit)
Wordpress 4.1.0