跳到主要内容

开发环境搭建

双系统安装

Windows

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

在对硬盘进行分区的时候,Windows系统会自动创建几个分区(以目前1T固态硬盘作为系统盘为例):

类型总大小
系统分区100MB
MSR(保留)16MB
恢复687MB

再加上每个磁盘分区在格式化之后都会少100MB,所以如果我们想正好分配250G给C盘的话,那么需要分配总大小 :

100MB+16MB+687MB+100MB+250*1024MB=256903MB

在安装过程中,我们希望跳过网络连接和微软账户登录。因为这样会使得用户目录不太优雅,极有可能我们的用户目录是 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 中的高级设置配置进行配置。

安装中文字体:

sudo apt install language-pack-zh-hans
虚拟磁盘文件

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

MSYS2

安装完成后,使用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

在Qt Creator菜单栏:编辑 → Preferences... → 版本控制 → Git → 配置 → 附加在系统PATH之前,填入:

D:\msys64\usr\bin

Ubuntu

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

分区建议

待完善......

修改GRUB选项

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

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

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

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

sudo update-grub

代码格式化

介绍

平时团队进行合作的时候需要注意代码的格式,虽然很难统一每个人的编码风格,但是通过工具能够很好的管理代码格式。这里介绍下clang-format,它是基于clang的一个命令行工具,能够自动化格式C/C++/Obj-C代码,支持多种代码风格:Google, Chromium, LLVM, Mozilla, WebKit,也支持自定义风格(通过编写.clang-format文件)很方便的统一代码格式。

使用方法

  • Linux下下安装clang-format :

    sudo apt-get install clang-format
  • 以LLVM代码风格格式化main.cpp, 结果直接写到main.cpp

    clang g-format -i main.cpp -style=LLVM
  • 当然也支持对指定行格式化,格式化main.cpp的第1,2行

    clang-format -lines=1:2 main.cpp
  • vim 中也可以集成该插件

  • 它提供一个clang-format-diff.py脚本,用来格式化patch,code review提交代码

配置文件说明

  • 配置文件.clang-format详细说明

    # 基于那个配置文件
    BasedOnStyle: LLVM
    # 访问说明符的偏移(public private)
    AccessModifierOffset: -4
    # 括号之后,水平对齐参数: Align DontAlign AlwaysBreak
    AlignAfterOpenBracket: Align
    # 连续的赋值时,对齐所有的等号
    AlignConsecutiveAssignments: true
    # 连续声明时,对齐所有声明的变量名
    AlignConsecutiveDeclarations: true
    # 左对齐换行(使用反斜杠换行)的反斜杠
    AlignEscapedNewlinesLeft: true
    # 水平对齐二元和三元表达式的操作数
    AlignOperands: true
    # 对齐连续的尾随的注释
    AlignTrailingComments: true
    # 允许函数声明的所有参数在放在下一行
    AllowAllParametersOfDeclarationOnNextLine: true
    # 允许短的块放在同一行
    AllowShortBlocksOnASingleLine : false
    # 允许短的case标签放在同一行
    AllowShortCaseLabelsOnASingleLine: false
    # 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All
    AllowShortFunctionsOnASingleLine: Empty
    # 是否允许短if单行 If true, if (a) return; 可以放到同一行
    AllowShortIfStatementsOnASingleLine: false
    # 允许短的循环保持在同一行
    AllowShortLoopsOnASingleLine: false
    # 总是在定义返回类型后换行(deprecated)
    AlwaysBreakAfterDefinitionReturnType: None
    # 每行字符的限制,0表示没有限制
    ColumnLimit: 100
    # 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变
    CommentPragmas: '^ IWYU pragma:'
    # 语言: None Cpp Java Objc Protp
    Language: Cpp
    #指针的*的挨着哪边
    PointerAlignment: Right
    #缩进宽度
    IndentWidth: 4
    # 连续的空行保留几行
    MaxEmptyLinesToKeep: 1
    # 在 @property 后面添加空格, \@property (readonly) 而不是 \@property(readonly).
    ObjCSpaceAfterProperty: true
    # OC block后面的缩进
    ObjCBlockIndentWidth: 4
    # 是否允许短方法单行
    AllowShortFunctionsOnASingleLine: false
    # 换行的时候对齐操作符
    #AlignOperands: true
    # 中括号两边空格 []
    SpacesInSquareBrackets: true
    # 小括号两边添加空格
    SpacesInParentheses : false
    #等号两边的空格
    SpaceBeforeAssignmentOperators: true
    # 容器类的空格 例如 OC的字典
    SpacesInContainerLiterals: true
    #缩进
    IndentWrappedFunctionNames: true
    #在block从空行开始
    KeepEmptyLinesAtTheStartOfBlocks: true
    #在构造函数初始化时按逗号断行,并以冒号对齐
    BreakConstructorInitializersBeforeComma: true
    #括号后添加空格
    SpaceAfterCStyleCast: false
    # 允许排序#include, 造成编译错误
    # SortIncludes: true
    # 缩进case 标签
    IndentCaseLabels: true
    #tab键盘的宽度
    TabWidth: 4
    UseTab: Never

QtCreator下的使用

QtCreator下默认只会格式化C++代码,如果要格式化C代码,需要在Restrict to MIME types中添加C源文件的MIME类型 text/x-csrc

BasedOnStyle: LLVM

ObjCBlockIndentWidth: 4
IndentWidth: 4
TabWidth: 4
AccessModifierOffset: -4
ColumnLimit: 120

AllowShortFunctionsOnASingleLine: false

# 函数后的大括号换行
# BreakBeforeBraces: Custom
# BraceWrapping:
# AfterFunction: true

# 模板声明后换行
AlwaysBreakTemplateDeclarations: true

# 是否允许短if单行 If true, if (a) return; 可以放到同一行
AllowShortIfStatementsOnASingleLine: true

# 短句 while (true) continue; 能被放到单行。
AllowShortLoopsOnASingleLine: true

对于不需要格式化的地方,加上下面两行注释即可。

// clang-format off
QVector3D cubePositions[] = {
QVector3D(0.0f, 0.0f, 0.0f),
QVector3D(2.0f, 5.0f, -15.0f),
QVector3D(-1.5f, -2.2f, -2.5f),
QVector3D(-3.8f, -2.0f, -12.3f),
QVector3D(2.4f, -0.4f, -3.5f),

QVector3D(-1.7f, 3.0f, -7.5f),
QVector3D(1.3f, -2.0f, -2.5f),
QVector3D(1.5f, 2.0f, -2.5f),
QVector3D(1.5f, 0.2f, -1.5f),
QVector3D(-1.3f, 1.0f, -1.5f)
};
// clang-format on

VS Code下的使用

进入 文件->首选项->设置 页面,然后搜索 clang。

"C_Cpp.clang_format_fallbackStyle": "LLVM"
"C_Cpp.clang_format_style": "file"

然后在源码目录创建.clang-format文件,将之前的格式设置复制粘贴进去保存即可。

Git

中文乱码的问题

原因在默认设置下,中文文件名在工作区状态输出,中文名不能正确显示,而是显示为八进制的字符编码。

解决办法:将git 配置文件 core.quotepath项设置为false。quotepath表示引用路径, 加上--global表示全局配置

git bash 终端输入命令:

git config --global core.quotepath false

将编辑器设置为VIM

git config --global core.editor vim

双系统

时间不一致

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

安装Nvidia驱动

禁用 Nouveau Nvidia 驱动

sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf"

# 重新生成kernel initramfs
sudo update-initramfs -u

# 然后必须重启。
sudo reboot now

重启后需要进入tty模式安装显卡驱动。

sudo telinit 3
./NVIDIA-Linux-x86_64-390.87.run

驱动安装完成后,重启。然后可安装如下两个软件,进行显卡之间的切换。

sudo apt install nvidia-prime nvidia-prime-applet

生成公私/钥

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

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

ssh-keygen -t rsa -b 4096 -C "168062547@qq.com"

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

Enter file in which to save the key (/home/amass/.ssh/id_rsa): /home/amass/id_rsa_test_key

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

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

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

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

然后尝试登录:

ssh -i /home/amass/id_rsa_test_key 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,)在右侧将 整个文件 更改为 更改的行