跳到主要内容

Windows开发环境搭建

· 阅读需 15 分钟
阅读量: 101阅读人次: 102

一开始接触到程序开发时,使用的就是 Windows 系统,那是已经是 Windows 8.1 了吧。从那时开始,总是喜欢折腾重装系统,强迫症迫使总想装一个十分干净的系统,或者哪里配置错了就立马想着重装。重装解决一切问题,真不是说着玩玩的,但是也浪费了大把时间。嗯,把这个时间用来干啥不好......

系统安装

下载 Windows 11 ISO文件,准备一个8G或以上的U盘,使用 Rufus 创建USB启动盘。

在对硬盘进行分区的时候,每个磁盘分区在格式化之后都会少100MB(或200MB,不清楚原因,可以尝试),所以如果我们想正好分配250G(资源管理器看到的磁盘总大小)给D盘的话,那么需要分配总大小 :

100MB+250*1024MB=256100MB

在安装过程中,我们希望跳过网络连接和微软账户登录。因为这样会使得用户目录不太优雅,极有可能我们的用户目录是 C:\Users\16806 这样的邮箱前缀,或者 C:\Users\张三 这样带中文的目录,给编程有些程序调试带来障碍(有些程序不能很好的兼容非ASCII字符路径)。所以我们在安装的过程中,一定要记住断开网络,在安装引导界面键入Shift + F10 调出CMD窗口,然后输入:

OOBE\BYPASSNRO

跳过网络连接。

安装WSL2

安装完系统后,推荐立马安装WSL2,目前我觉得这是一个非常不错的Windows下开发工具套件。但是此前安装过程中,因为网络等问题出现过各种稀奇古怪且在Google搜不到的问题,所以推荐安装完系统后立马安装WSL2,这样一来如果出现问题我们可以立马选择重装系统重新来一遍。

wsl --install

移动位置

安装完WSL之后,为了避免占用C盘过多空间,一般选择移动到其他几个磁盘分区中:

D:                # 进入根目录 D:/
wsl --list
wsl --export Ubuntu Ubuntu.tar
wsl --unregister Ubuntu
wsl --import Ubuntu D:\Ubuntu D:\Ubuntu.tar
ubuntu.exe config --default-user amass

如果需要配置WSL2,例如限制占用最大内存等等,可创建C:\Users\%YourName%\.wslconfig文件然后参考 WSL 中的高级设置配置进行配置。

中文设置

参考 Ubuntu 开发环境搭建 中文设置

OpenSSH Server

参考 Ubuntu 开发环境搭建 OpenSSH Server 安装配置后,我们还需打开端口的 Windows 防火墙:

New-NetFirewallRule -DisplayName "WSL2 SSH" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 1022

创建 Powershell 文件启动 sshd 服务,然后对该 SSHD 端口流量进行转发:

# 启动 sshd 服务
wsl -u root -e sh -c "service ssh start"

$wsl_ip = (wsl hostname -I).trim()
netsh interface portproxy delete v4tov4 listenport=1022
netsh interface portproxy add v4tov4 listenport=1022 connectport=1022 connectaddress=$wsl_ip

该脚本需要以管理员权限运行。

另外,WSL 如果监测到系统处于空闲状态,会自动结束系统进程,所以我们在运行上述脚本使用 ssh 访问之前,最好在 Windows 先打开一个 Ubuntu 终端让系统一直保持非空闲被使用的状态。

虚拟磁盘文件

WSL 的虚拟磁盘 ext4.vhdx 文件,如果虚拟机被损坏(例如不小心删掉了一些配置文件,导致无法运行WSL),可以将 ext4.vhdx 备份,然后使用 7-Zip 打开该文件,将重要文件拷贝出来。

MSYS2

MSYS2 在Windwos上提供了一个 Linux 命令环境。安装完成后,使用Windows Terminal作为终端。在Terminal Tab下拉框,找到设置,点击左下角的打开JSON文件,在profiles.list加入如下item:

{
"guid": "{17da3cac-b318-431e-8a3e-7fcdefe6d114}",
"name": "UCRT64 / MSYS2",
"commandline": "D:/msys64/msys2_shell.cmd -defterm -here -no-start -ucrt64",
"startingDirectory": "D:/msys64/home/%USERNAME%",
"icon": "D:/msys64/ucrt64.ico",
"font":
{
"face": "Lucida Console",
"size": 14
}
}

MSYS2更新包:

pacman -Q	# 查看已安装的软件包
pacman -Suy # 更新 msys2及其所有已安装的包
pacman -S mingw-w64-ucrt-x86_64-nodejs # 安装nodejs
pacman -R mingw-w64-x86_64-nodejs # 删除软件包
pacman -S git # 安装git

继承 Windows 环境变量

需要修改 D:\msys64\msys2_shell.cmd 中的 rem set MSYS2_PATH_TYPE=inherit。去掉rem,以取消这⼀句的注释。使MSYS2的环境变量继承 Windows 的 PATH 环境变量。这样就可以在 MSYS2 的终端使用诸如 code VS Code 这样的 Windows 终端命令了。

加入 Windows 环境变量

我们在 MSYS2 安装了 Git、Nodejs 等包,也可以将 D:\msys64\ucrt64\binD:\msys64\usr\bin 路径加入 Windows 的 PATH 环境变量,这样就可以在 Windows 的 CMD 或 Powershell 终端使用来自 MSYS2 的命令了。

不过自测,在一些复杂的命令使用情况会遇到一些问题。可能是两者字符处理的,路径处理的方式不同带来的问题。如果交叉使用某些命令遇到了问题,需要优先考虑是不是这样用带来的问题。

生成公私/钥

在日常开发中,或多或少都会使用SSH登录远端机器,或者在Docker。这时比起设置密码来说,使用公私/钥进行登录就会比密码便捷安全的多(前提是一定要保护好私钥,不要泄漏出去)。

在构建Docker镜像时,如果我们想未某个用户添加密码,那么通过何种方式(环境变量,或者脚本),密码都是不安全的(不考虑 Docker Swarm),能被通过一些方式查看到(例如 docker inspect)。

ssh-keygen -C "168062547@qq.com"

系统将提示你输入文件保存路径。如果你不想覆盖现有的SSH密钥,可以指定一个新的文件名:

Enter file in which to save the key (/home/amass/.ssh/id_ed25519): /root/amass/id_ed25519_amass

然后提示输入密钥密码(passphrase),为了使用的便捷性,我们选择留空,接受略微降低安全性的损失。

步骤完成之后,会在 /home/amass 目录下生成公钥文件id_ed25519_amass.pub以及私钥文件id_ed25519_amass

我们可以将公钥添加到远端服务器:

ssh-copy-id -i /home/amass/id_ed25519_amass.pub user@hostname

然后尝试登录:

ssh -i /home/amass/id_ed25519_amass user@hostname

VS code

在项目下新建.vscode/settings.json,建议填入如下内容:

{
"editor.formatOnSave": true,
"editor.formatOnSaveMode": "modificationsIfAvailable",
"files.exclude": { // 隐藏文件夹
"calibration":true, // 根目录下的calibration目录
"canbus":true // 根目录下的canbus目录
}
}

ctrl + shift + p 在设置页面搜索enablePreview,取消选择。使得打开文件会重开一个新的窗口。

在 File → Preferences → Settings → Window → Title Bar Style 选择 "window.titleBarStyle": "custom" 以显示VS Code自定义标题栏,这在Ubuntu下尤其有用。

关闭右侧滚动条旁的缩略图:editor.minimap.enabled: false

Remote - SSH

使用 Remote - SSH 能够很方便的在 VS Code 下访问远端主机。安装好插件之后,

编辑 ssh 配置文件 ~/.ssh/config (Windows下一般为 C:\Users\your_account\.ssh\config)。

~/.ssh/config
Host my-remote-server
HostName example.com
User your-username
IdentityFile /path/to/your/private/key
Port 22
  • Host 是你为这个连接定义的别名。使用中可以通过命令 ssh my-remote-server 登录远端而不必输入 ssh your-username@example.com

  • HostName 是远程服务器的 IP 地址或域名。

  • User 是你的远程服务器用户名。

  • IdentityFile 是你的私钥文件的路径。确保 VSCode(或其后台进程)有权限读取这个文件。

    私钥文件可能存在文件权限太宽松导致 ssh 提示:

    Bad permissions. Try removing permissions for user: NT AUTHORITY\\Authenticated Users (S-1-5-11) on file E:/Projects/id_rsa_amass.
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @ WARNING: UNPROTECTED PRIVATE KEY FILE! @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    Permissions for '.\\id_rsa_amass' are too open.
    It is required that your private key files are NOT accessible by others.
    This private key will be ignored.
    Load key ".\\id_rsa_amass": bad permissions

    在 Windows 下可以以管理员权限打开终端,然后运行如下命令,使得私钥文件只有 amass 才有权限读写:

    icacls.exe E:\Projects\id_rsa_amass /inheritance:r /grant amass:R

    权限修改完成后,就能正常访问 ssh 服务了。

  • Port 是 SSH 服务的端口,通常是 22,除非服务器配置了不同的端口。

GitLens

GitLens — Git supercharged:这个插件可以在每一行查看commit记录。

QtCreator

Linux下Perf调试

安装perf

sudo apt install linux-tools-common linux-tools-generic linux-tools-`uname -r`

在terminal输入以下命令

sudo sysctl -w kernel.perf_event_paranoid=1

CLion

在 Settings ➡ Plugins 搜索 Chinese 选择中文语言包,进行汉化。

在 设置 ➡ 编辑器 ➡ 文件编码 中,将 项目编码 改为 UTF-8。将 创建 UTF-8 文件 改为 包含 BOM(因为我大部分的代码都需要在 Windows 下编译)。对于已存在文件,可以在 CLion 下方状态右下角显示文件编码处,点击它更改文件编码。

在 设置 ➡ 编辑器 ➡ 常规 ➡ 代码折叠 中,将 默认折叠 ➡ 常规 下的 文件头 取消勾选。

在 设置 ➡ 编辑器 ➡ 代码样式 ➡ CMake 中,将 制表符和缩进 下的 连续缩进 改为 4。

在 设置 ➡ 编辑器 ➡ 实时模板 中,点击 + 号创建一个实时模板,在 C/C++ 中创建 缩写 为 main 的模板,模板文本为:

int main(int argc, char const *argv[]) {

return 0;
}

然后点击 定义,勾选 CC++。这样我们在打出 main 时,CLion 会提示出这个模板,选中它按回车即可自动填入模板文本。

在 设置 ➡ 工具 ➡ 保存时的操作 中,勾选 重新格式化代码。(如果项目使用了 Git,)在右侧将 整个文件 更改为 更改的行

SecureCRT

SecureCRT 相比 PuTTYMobaXterm 等调试工具有一个突出的优点,它的log功能非常好用,可以在每行log都加入时间戳,精确到毫秒,以下是 SecureCRT 的log配置设置:

打开 OptionsConfigureDefault Session...TerminalLog File

  • Log file name 设置为:E:\Downloads\%S-%Y%M%D%h%m%s.log
  • 勾选 Options 下的:Overwrite fileStart log upon connect
  • Custom log data 下的 On each line: 设置为:[%h:%m:%s.%t] (注意在]加上空格以增强日志阅读性)。

日志文件名和自定义日志数据替换:

  • %H:主机名(连接主机的IP地址)
  • %S:会话名
  • %Y:年份
  • %M:月份
  • %D:日
  • %h:小时
  • %m:分钟
  • %s:秒
  • %t:毫秒

Default Session... 是指配置之后,每次创建新的 session 都会导入该配置,无需重复配置,非常方便。

VMware

VMware Workstation 17 Pro 貌似在兼容性做的不够好,在运行 Windows7、Ubuntu 24.04 时,装好虚拟机运行后就会导致 VMware 直接卡死。这里找到一个临时的解决办法:

在虚拟机的设置中,关闭 加速3D图形 选项。

双系统安装

出于一些原因,可能有时候需要安装双系统,在原理和使用上是没问么问题的。

但是总不这么推荐,因为很容易一个系统破坏另一个系统。结果导致就是又得来一次重装系统,资料丢失。一直在折腾的路上。有钱且不考虑数量体积的前提下,还是推荐一个终端安装一个系统。

引导项设置

这里不叙述 Ubuntu 系统的安装,安装完双系统之后,我们一般选择GRUB作为主引导程序,因为我们大部分时间还是使用Windows,所以需要修改其默认启动Windows。

在 Ubuntu 下以管理员权限使用 nano 编辑 /etc/default/grub 文件:

GRUB_DEFAULT=  (GRUB默认启动项)
GRUB_TIMEOUT= (GRUB选择项的等待时间)

修改完成后,在终端输入如下命令,并重启即可。

sudo update-grub

时间不一致

sudo apt install ntpdate
sudo ntpdate time.windows.com
sudo hwclock --localtime --systohc