第零篇.WSL+Cmake+Opencv的环境搭建
Games101课程中作业使用的环境搭在虚拟机上,虽然减少了不少麻烦但是每次使用虚拟机的体验是非常糟心的:操作繁杂以及加载时间慢令人难以忍受,因此在此我们考虑在windows系统下搭建所需环境,也就是wsl+cmake+opencv方案。该方案除了可以用于Games系列课程外在csapp等课程中亦有作用,推荐考虑(总有一天得用linux,不妨从现在开始熟悉)网上相关教程也有许多,我这里算是一个归纳并且文中也涵盖了我遇到的一些问题以及对应的解决方式,说不定也可以为你提供一些帮助。
WSL
简介:
全称Windows Subsystem for Linux,即windows下的linux子系统。虽然在知乎也有一些诟病但个人认为是目前非linux系统PC的最好折中方案,相比双系统来说实现简便且亲和小白,又比虚拟机使用快捷舒服,推荐使用。
安装流程:
可以参照官网文档,我这里则做一些简化。
windows商店下载Ubuntu
我这里下载的是Ubuntu20.04 LTS版
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 |
重启电脑。
将WSL2设为默认版本:
1 | wsl --set-default-version 2 |
【可选】Windows商店下载Windows Terminal,个人推荐,使用蛮舒服的
测试:
创建账户
打开你安装的Ubuntu,根据提示创建账号。该账户会成为子系统的默认账户,并且视为管理员,也就可以使用sudo
(super user do)的管理命令了
更新包
1 | sudo apt update && sudo apt upgrade |
测试wsl
打开windows terminal,输入wsl,出现以下情况即说明wsl安装成功
当然第一次输入还会有一串文字欢迎使用ubuntu什么之类的,总之只要最后成功跳转到你的账户即可。
问题出现&&解决
你可能会遇到以下问题
该问题网上的解释是使用某些代理软件造成的网络端口冲突(嘛,谁还没几个VPN、加速器啥的233),因此需要重置网络环境。
方案1
管理员运行cmd输入:
1 | netsh int ip reset |
然后wsl就可以正常使用了,但是需要注意的是这种方法可能导致代理软件无法使用。
方案2
使用Nolsp,在cmd中输入:
1 | NoLsp.exe C:\windows\system32\wsl.exe |
详细内容包括NoLsp包安装可以看:知乎-关于使用WSL2出现“参考的对象类型不支持尝试的操作”的解决方法。
换下载源:
为了提高下载速度换成清华镜像源,打开清华镜像站并选择对应的Ubuntu版本,我这里选择Ubuntu20.04
备份源列表文件:
1 | cd /etc/apt/ |
修改源文件:
1 | sudo vim sources.list |
将清华站中的文字复制粘贴到源文件即可,最后更新:
1 | sudo apt-get update |
Cmake
写在前面:
最简单的安装和配置方式是参考知乎-GAMES101课程环境搭建(Win10+VSCode),该帖子提供了可视化的环境搭建,但是可能会出现很多问题,比如win10系统用户名为中文就基本无法使用该方案。如果你也遇到了一些报错无法采用该方案,则不妨考虑以下内容:
安装:
选择官网安装,不要忘了配置环境变量。或者可以选择使用apt
安装,进入wsl输入:
1 | sudo apt-get install cmake |
检查是否安装成功:
1 | cmake --version |
即Cmake安装成功
Opencv
安装流程:
### 下载
选择官网安装,点击Sources
编译安装
在你解压的opencv文件夹里鼠标右键选择“打开windows terminal”进入wsl,创建build文件夹:
1 | mkdir 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 | cmake -D CMAKE_BUILD_TYPE=RELEASE \ |
最终结果类似(照片来自https://linuxize.com/post/how-to-install-opencv-on-ubuntu-18-04/):
开始编译:
1 | sudo make -j8 |
安装:
1 | sudo make install |
上面两步过程很慢,可以趁机刷会B站啥的
配置环境
1 | sudo vim /etc/ld.so.conf |
加入/usr/loacal/lib
,即
1 | include /etc/ld.so.conf.d/*.conf |
:wq
保存退出后运行sudo ldconfig
(vim使用方法详见菜鸟教程,主要几个就是i
,q
,wq
指令)
接着类似方法用vim修改/etc/bash.bashrc
文件,在末尾加入:
1 | PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig |
然后source,source /etc/bash.bashrc
检查安装
1 | pkg-config --modversion opencv4 |
上述显示说明安装成功啦。
测试&&问题解决:
测试
我们利用opencv的自带测试程序,在解压opencv的路径中寻找/opencv-4.3.0/samples/cpp/example_cmake
进入该文件夹,打开windows terminal,依次输入:
1 | mkdir build |
其中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-dev
和pkg-config
可能安装失败了,重新下载然后回到opencv的编译环节,也就是上文Opencv编译安装环节的**Cmake(*)**处
#### 第二个问题
如果上个问题没有出现或者解决了的话,自然就会遇到该问题:
这个是正常的,因为子系统无法调用硬件也无法调出图形化界面。但是我们使用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
,截图如下:
之所以有区别在于,windows会通过虚拟交换机给win10本机与WSL2子系统各自会分配一个ip地址,当windows电脑重启并再次打开WSL2时,虚拟交换机会被重新创建,分配给它们的ip地址也会随着改变。所以无法像WSL1那样直接赋予静态IP。
修改设置
进入安装位置,打开XLaunch.exe
,第一页和第二页均保持默认直接next即可,在第三页注意勾选"No Access Control",然后在第四页点击"Save configuration",生成的config.xlaunch
文件作为以后启动的X-server文件建议将其放到桌面上方便后续使用。
点击完成后,后台Xming便会开启监听:
正常结果:
以上文opencv的测试文件为例:
问题出现&&解决
在opencv测试程序时包括运行后续文件可能会出现:
问题1:
此时光标一直在闪,说明程序正在运行但是没有图形化界面调出,原因在于Xming没有开始监听。得打开保存的config.xlaunch
文件开启监听才可以。
### 问题2:
原因是x-server没有配置,说明开启监听时打开的不是已经保存配置的config.xlaunch
而是打开了Xming.exe
。如果之前没保存config.xlaunch
文件,则重新运行xlaunch.exe
进行配置。
写到最后
测试:
拿GAMES101作业1为例,最后结果应该是一个三角形按照输入方向旋转
到这一步,终于大功告成啦!
以上便是我对多个教程帖子以及个人部分问题解决的总结。