虚拟机使用 Oracle VirtualBox,操作系统使用 Ubuntu18.04,集成开发环境使用 VSCode,构建系统使用 cmake,编译器使用 llvm/clang 6.0,调试器使用 lldb。下面记录了大部分问题和解决步骤:
- 安装 Ubuntu 18.04:
- 安装虚拟机:Oracle VirtualBox,这是一款免费软件。下载地址 https://www.virtualbox.org/wiki/Downloads
- 使用 Ubuntu 18.04 iso 光盘映像安装 Ubuntu18.04,下载地址 http://releases.ubuntu.com/18.04/
- VirtualBox 创建虚拟操作系统时最好是用动态磁盘,而且容量要大。
- 如果虚拟磁盘容量不够了,可以关闭Linux,然后在设置/存储内新增一个控制器(AHCI),创建一个新磁盘,然后启动Linux 执行下列步骤
- 磁盘分区和格式化
- sudo fdisk -lu # 列出所有设备,一般是 /dev/sdb 一类名字
- sudo fdisk /dev/sdb # 新磁盘分区
- 输入 m(menu)<CR> -> n(add a new partition)<CR> -> p(primary)<CR> -> <CR> -> <CR> -> w(write table to disk and exit)<CR>
- sudo mkfs.ext4 /dev/sdb
- 输入 y<CR>
- 挂载新磁盘
- sudo umount /dev/sdb # 先取消挂载,此命令可以不执行
- sudo mkdir -p /home/nsw/devel # 创建挂载目的目录
- sudo gedit /etc/fstab # 编辑挂载点配置文件
- 增加一行 /dev/sdb /home/nsw/devel ext4 relatime 0 2
- 保存退出
- sudo mount -a # 让配置起效
- 将原磁盘内的源码复制到新磁盘内
- cd /home/nsw
- cp -r /home/nsw/src/* /home/nsw/devel/ #先拷贝出来
- rm -rf /home/nsw/src # 删除源文件
- 改变挂载点
- 编辑挂载点配置文件,最后一行挂载位置改为 /home/nsw/src,保存
- 执行 sudo mount -a
- 解决覆盖文件时的提示 Operation not permitted
- 不能用 sudo chmod -R 777 /home/nsw/src # 递归更改权限,这一行没什么用,现在 /home/nsw/src 的所有者是 root:root
- sudo chmod -c --reference=/home/nsw /home/nsw/src # 更改目录所有者为已有目录 /home/nsw 的所有者
- 磁盘分区和格式化
- 虚拟机OS和宿主OS之间的数据交换方式:
- 采用剪贴板和拖放支持
- 选择VM窗口的菜单:
- 设备→安装增强功能
- 设备->共享剪贴板 双向(测试发现实际不可用)
- 设备->拖放 双向(可用)
- 重启 Ubuntu
- 使用 http server(Python3.x)
- 在 shell 内切换到要共享的目录
- python3 -m http.server 8088
- 采用剪贴板和拖放支持
- 更改分辨率
- 运行 Settings,选择 Devices-> Resolution,选择一个大些的分辨率后,屏幕显示不全,这时可以按三次 tab 键切换焦点到 Apply按钮,回车
- 配置中文输入法
- 运行 Settings,选择 Region & Language,在 Input Sources 下面点击按钮+,选择 Chinese,再选择 Intelligent Pinyin
- 问题解决
- 鼠标偏移现象:缩放模式下,容易发生鼠标偏移现象,请将分辨率改小些(1280 * 1024 或 1600 * 1200),或者按 RightCtrl + C 返回窗口模式
- 菜单全黑:需要关闭 Linux 虚拟机,然后在虚拟机设置对话框内禁用 "显示->屏幕->硬件加速"
- 重启 Ubuntu 后自动恢复会话(可选)
- sudo apt install dconf-tools
- dconf-editor
- 界面内进入 org/gnome/gnome-session, 打开 auto-save-session
- 增加 PATH 环境变量(可选)
- export PATH="/snap/bin:$PATH"
- echo $PATH
- 安装 git
- sudo apt install git
- git --version 输出为 v2.17.1
- 配置 ssh key
- 自行生成 ssh key
- ssh-keygen -t rsa
- cat ~/.ssh/id_rsa.pub
- 然后将输出的 id_rsa.pub 文件内容上传到 gitlab 内的 ssh keys 内
- 从 windows 内拖过来,拷贝到 ~/.ssh 内,需要更改权限,否则 git clone 仍然报错
- chmod 755 ~/.ssh/
- chmod 600 ~/.ssh/id_rsa ~/.ssh/id_rsa.pub
- chmod 644 ~/.ssh/known_hosts
- 自行生成 ssh key
- 让 windows 下的 git 提交时自动将 crlf 转为 lf,签出时反向操作
- git config --global core.autocrlf true
- 设置一个全局 ignore 文件
- git config --global core.excludesfile '~/.gitignore'
- 在命令行使用交互式提交
- git commit --interactive
- 如果想更新文件,u<CR>,然后按已改变文件前面的索引数字,可以把文件状态变为 staged
- 如果想添加新文件,a<CR>,然后按已改变文件前面的索引数字,可以把文件状态变为 staged
- 想看现在 staged 了哪些文件,按 s<CR>
- 看文件 diff,按 d<CR>,然后按已改变文件前面的索引数字
- 添加或更新完毕,多按一个 <CR>,再按 q<CR>
- 然后编辑 commit message,下面 #打头的行可以不用理会
- 输入完 message 可以按 Ctrl+O<CR> 保存
- 按 Ctrl+X 退出,提交完毕
- git commit --interactive
- sudo apt install git
- 安装 python2.7
- 选择 anaconda python2.7版本,下载地址 https://www.anaconda.com/distribution/,优点是可以灵活切换 python 版本
- 重启 console 窗口后提示符前面有 (base)
- 安装 cmake
- (错误)使用 apt 安装:sudo apt install cmake # 安装的 cmake 版本为 3.10,太低
- 将安装的低版本卸载:sudo apt remove cmake
- (错误)使用 https://cmake.org/download 下载的linux 二进制文件和脚本安装,没有正确安装,无法正常运行
- (错误)下载源码,解压缩进入源码目录,执行 sudo ./bootstrap --prefix=/usr,提示缺少 openssl 开发包
- 使用 Ubuntu Software 来安装,搜索到两个版本,一个是 3.10(不要用),另一个是 3.17(使用这个)
- (错误)使用 apt 安装:sudo apt install cmake # 安装的 cmake 版本为 3.10,太低
- 安装编译器
- sudo apt install gcc g++ ninja-build llvm clang
- 获取编译器内置宏列表
- 获取 clang 的 builtin macros: clang -dM -E -x c /dev/null
- 获取 gcc 的 builtin macros: gcc -dM -E -x c /dev/null
- 安装开发包
- 安装 gtk(gbase message loop用到)
- sudo apt install libgtk-3-dev
- 安装 x11 开发包
- sudo apt install libx11-dev
- Xlib 开发手册:https://tronche.com/gui/x/xlib/
- 以安装 glew 开发包为例(使用 pkg-config)
- 显示 glew 模块信息:pkg-config --modversion glew
- 如果没有安装,可以先搜索:apt search glew
- 一般的输出是前面可能有 lib 前缀,后面可能带有版本号和 -dev 后缀,尽量使用带后缀 -dev 的
- 安装:sudo apt install libglew-dev
- 验证:pkg-config --cflags --libs glew
- 安装 gtk(gbase message loop用到)
- 安装 vscode
- 下载地址 https://code.visualstudio.com/,注意 anaconda 内的 vccode 不能运行
- 在 vscode 内安装 extensions,要注意包名:
- C/C++,包名 ms-vscode.cpptools
- C++ Intellisense,包名 austin.code-gnu-global,用于代码提示,代码跳转
- CMake,包名 twxs.cmake,用于编辑 CMakeLists.txt 脚本时的语法提示
- CMake Tools,包名 gocarlos.cmake-tools,用于 cmake 构建,搜索时会出现两个,不要使用 1.3.1 版本,使用 1.5.2 版本
- Native Debug,包名 webfreak.debug,用于本地调试
- vscode 以 folder 为单元,一个 workspace 可以包含多个 folder,每个 folder 相当于一个项目
- vscode 的设置分为两种,一种是用户全局设置(储存于 ~/.config/Code/User/settings.json),一种是对每个 folder 的设置(储存于 folder 下子目录 .vscode/settings.json)
- 让 vscode 自动创建 settings.json:
- 在左侧贴边工具栏内点击 extensions,切换到扩展管理页面,并打开 cmake tools 的右键菜单最后一项
- 在设置页面内找一个带 Edit in settings.json 的,就自动创建了 .vscode 目录和下面的 settings.json
- 让 vscode 自动创建 launch.json:
- 在左侧贴边工具栏内点击 Run,切换到调试页面,点击其中的链接 Create configure in a launch.json
- 使用 settings.json 将参数传递给 cmake
- cmake.buildDirectory 是构建目录
- cmake.sourceDirectory 是源码目录
- cmake.environment 可以设置各种环境变量
- cmake.configureArgs 可以将参数传递给 cmake 命令行
- cmake.installPrefix 可以设置 install 目的目录
- 上面的参数支持内部变量扩展,vscode 内部变量列表参考 https://code.visualstudio.com/docs/editor/variables-reference
- 使用 tasks.json 自定义任务(待补充)
- 使用 launch.json 定义如何运行和调试
- program 属性,设置为程序全路径
- cwd 属性,设置为程序运行时的初始目录
- 定义好以后,切换到 debug 页面
- 在上面选择好 launch.json 定义好的配置,点击前面的绿色空心三角可以开始调试
- 打好断点后的调试界面
- 参考 https://code.visualstudio.com/docs/editor/debugging
- 其它:
- 解决乱码问题:
- Linux 提交源码后的中文变成乱码,因为 linux 编辑文件默认用的是 utf-8 编码,windows 是 gbk
- git config --global i18n.commitencoding utf-8
- git config --global i18n.logoutputencoding gbk
- ls 时中文显示为 ????
- alias ls="ls --show-control-chars"
- Linux 提交源码后的中文变成乱码,因为 linux 编辑文件默认用的是 utf-8 编码,windows 是 gbk
- 查看当前字体
- sudo apt install gnome-tweak-tool
- gnome-tweak-tool
- 如果编译时找不到文件,如:glib.h
- locate glib.h
- 如果 locate 命令不存在:sudo apt install mlocate
- 如果出现 cmake 创建软链接失败,是因为构建目录不能是 windows 共享目录,NTFS 不支持软链接
- 使用 ln -s <exist_file> <new_symbolic_file> 可以测试是否能创建软链接
- git 操作访问不了你的 gitlab.xxx.com
- dig gitlab.xxx.com # 看看 DNS 是什么
- sudo gedit /etc/resolv.conf # 加上一行 nameserver 10.1.30.51 (这个IP是你知道的已有DNS server)
- 解决乱码问题: