Games101课程中作业使用的环境搭在虚拟机上,虽然减少了不少麻烦但是每次使用虚拟机的体验是非常糟心的:操作繁杂以及加载时间慢令人难以忍受,因此在此我们考虑在windows系统下搭建所需环境,也就是wsl+cmake+opencv方案。该方案除了可以用于Games系列课程外在csapp等课程中亦有作用,推荐考虑(总有一天得用linux,不妨从现在开始熟悉)网上相关教程也有许多,我这里算是一个归纳并且文中也涵盖了我遇到的一些问题以及对应的解决方式,说不定也可以为你提供一些帮助。

WSL

简介:

全称Windows Subsystem for Linux,即windows下的linux子系统。虽然在知乎也有一些诟病但个人认为是目前非linux系统PC的最好折中方案,相比双系统来说实现简便且亲和小白,又比虚拟机使用快捷舒服,推荐使用。

安装流程:

可以参照官网文档,我这里则做一些简化。

windows商店下载Ubuntu

我这里下载的是Ubuntu20.04 LTS版

wsl_1

WSL安装

首先在powershell启用wsl可选功能:

1
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

然后启用虚拟机功能:

1
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

重启电脑。

下载Linux内核更新包: x64版; ARM64版

将WSL2设为默认版本:

1
wsl --set-default-version 2

【可选】Windows商店下载Windows Terminal,个人推荐,使用蛮舒服的

wsl_2

测试:

创建账户

打开你安装的Ubuntu,根据提示创建账号。该账户会成为子系统的默认账户,并且视为管理员,也就可以使用sudo(super user do)的管理命令了

更新包

1
sudo apt update && sudo apt upgrade

测试wsl

打开windows terminal,输入wsl,出现以下情况即说明wsl安装成功

wsl_3

当然第一次输入还会有一串文字欢迎使用ubuntu什么之类的,总之只要最后成功跳转到你的账户即可。

问题出现&&解决

你可能会遇到以下问题

wsl_4

该问题网上的解释是使用某些代理软件造成的网络端口冲突(嘛,谁还没几个VPN、加速器啥的233),因此需要重置网络环境。

方案1

管理员运行cmd输入:

1
2
netsh int ip reset
netsh winsock reset

然后wsl就可以正常使用了,但是需要注意的是这种方法可能导致代理软件无法使用。

方案2

使用Nolsp,在cmd中输入:

1
NoLsp.exe C:\windows\system32\wsl.exe

详细内容包括NoLsp包安装可以看:知乎-关于使用WSL2出现“参考的对象类型不支持尝试的操作”的解决方法。

换下载源:

为了提高下载速度换成清华镜像源,打开清华镜像站并选择对应的Ubuntu版本,我这里选择Ubuntu20.04

wsl_5

备份源列表文件:

1
2
cd /etc/apt/
sudo cp sources.list sources.list.bak

修改源文件:

1
sudo vim sources.list

将清华站中的文字复制粘贴到源文件即可,最后更新:

1
2
sudo apt-get update
sudo apt-get upgrade

Cmake

写在前面:

最简单的安装和配置方式是参考知乎-GAMES101课程环境搭建(Win10+VSCode),该帖子提供了可视化的环境搭建,但是可能会出现很多问题,比如win10系统用户名为中文就基本无法使用该方案。如果你也遇到了一些报错无法采用该方案,则不妨考虑以下内容:

安装:

选择官网安装,不要忘了配置环境变量。或者可以选择使用apt安装,进入wsl输入:

1
sudo apt-get install cmake

检查是否安装成功:

1
cmake --version

cmake_1

即Cmake安装成功

Opencv

安装流程:

### 下载

选择官网安装,点击Sources

opencv_1

编译安装

在你解压的opencv文件夹里鼠标右键选择“打开windows terminal”进入wsl,创建build文件夹:

1
2
mkdir build
cd build

安装依赖:

1
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev \ libjpeg-dev libswscale-dev libtiff5-dev libgtk2.0-dev pkg-config

Cmake(*):

1
2
3
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_GENERATE_PKGCONFIG=ON ..

最终结果类似(照片来自https://linuxize.com/post/how-to-install-opencv-on-ubuntu-18-04/):

opencv_2

开始编译:

1
sudo make -j8

安装:

1
sudo make install

上面两步过程很慢,可以趁机刷会B站啥的

配置环境

1
sudo vim /etc/ld.so.conf

加入/usr/loacal/lib,即

1
2
include /etc/ld.so.conf.d/*.conf
/usr/local/lib

:wq保存退出后运行sudo ldconfig(vim使用方法详见菜鸟教程,主要几个就是i,q,wq指令)

接着类似方法用vim修改/etc/bash.bashrc文件,在末尾加入:

1
2
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

然后source,source /etc/bash.bashrc

检查安装

1
pkg-config --modversion opencv4

opencv_3

上述显示说明安装成功啦。

测试&&问题解决:

测试

我们利用opencv的自带测试程序,在解压opencv的路径中寻找/opencv-4.3.0/samples/cpp/example_cmake进入该文件夹,打开windows terminal,依次输入:

1
2
3
4
5
mkdir build
cd build
cmake ..
make
./opencv_example

其中cmake ..cmake .的区别是前者编译父文件夹,后者编译当前文件夹。

如果前面一切顺利可能会出现两个报错!

问题解决

第一个问题

类似下文

terminate called after throwing an instance of ‘cv::Exception’

what(): OpenCV(4.5.3-dev) /home/scs/opencv/modules/highgui/src/window.cpp:1275: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function ‘cvShowImage’

说明上述依赖libgtk2.0-devpkg-config可能安装失败了,重新下载然后回到opencv的编译环节,也就是上文Opencv编译安装环节的**Cmake(*)**处

#### 第二个问题

如果上个问题没有出现或者解决了的话,自然就会遇到该问题:

opencv_4

这个是正常的,因为子系统无法调用硬件也无法调出图形化界面。但是我们使用opencv的时候是需要图形化页面来呈现图像处理的结果,因此我们需要配置X-server以提供图形化界面。

X-server

下载&&配置:

下载

下载Xming然后一路默认安装,sourceforge下载地址

配置IP端口

1
sudo vim ~/.bashrc

根据wsl版本在该文件末尾选择添加内容:

wsl1用户加入export DISPLAY=:0.0, wsl2用户加入export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0,截图如下:

xming_0

之所以有区别在于,windows会通过虚拟交换机给win10本机WSL2子系统各自会分配一个ip地址,当windows电脑重启并再次打开WSL2时,虚拟交换机会被重新创建,分配给它们的ip地址也会随着改变。所以无法像WSL1那样直接赋予静态IP。

修改设置

进入安装位置,打开XLaunch.exe,第一页和第二页均保持默认直接next即可,在第三页注意勾选"No Access Control",然后在第四页点击"Save configuration",生成的config.xlaunch文件作为以后启动的X-server文件建议将其放到桌面上方便后续使用。

xming_1

xming_2

点击完成后,后台Xming便会开启监听:

ximg_3

正常结果:

以上文opencv的测试文件为例:

xming_3

问题出现&&解决

在opencv测试程序时包括运行后续文件可能会出现:

问题1:

xming_5

此时光标一直在闪,说明程序正在运行但是没有图形化界面调出,原因在于Xming没有开始监听。得打开保存的config.xlaunch文件开启监听才可以。

### 问题2:

xming_6

原因是x-server没有配置,说明开启监听时打开的不是已经保存配置的config.xlaunch而是打开了Xming.exe。如果之前没保存config.xlaunch文件,则重新运行xlaunch.exe进行配置。

写到最后

测试:

拿GAMES101作业1为例,最后结果应该是一个三角形按照输入方向旋转

result

到这一步,终于大功告成啦!

以上便是我对多个教程帖子以及个人部分问题解决的总结。

主要参考注释: