为了开发Steam VR平台上面的东西,不得不在Windows系统上使用Visual Studio进行开发。Visual Studio上面很多配置都是需要去层层菜单里面找,用鼠标去点UI来配置(除非你还想直接碰xml这种玩意儿),这对于习惯了Linux上使用代码,CLI等等配置环境的我来说,感到非常不适应,踩了很多坑,在此总结一下这种 UI操作构建系统 的要点。
下面具体的菜单操作都是以Visual Studio 2022
为例,其他版本基本一致。
生成工程
我感觉Github上的项目一般都是提供CMake的构建系统,然后再生成Visual Studio工程环境。
比如就像这样:
cmake .. -G "Visual Studio 12 2013 Win64" -DCMAKE_PREFIX_PATH=C:/Qt/5.6/msvc2013_64/lib/cmake
其中,Visual Studio 12 2013
中的12
是Visual Studio 2013
版本对应的Visual C++
版本,每个Visual Studio
版本都对应一个Visual C++
版本,具体如下表:
VS | VC |
---|---|
Visual Studio 2013 | VC12 |
Visual Studio 2015 | VC14 |
Visual Studio 2017 | VC15 |
Visual Studio 2019 | VC16 |
Visual Studio 2022 | VC17 |
很多时候标注的都是VC(即Visual C++
)版本而不是VS(即Visual Studio
)版本,所以需要这个表对照一下。
除了这种CLI的方法外,部分比较复杂的项目比如OpenCV
,还可以使用CMake GUI,可以参考这篇介绍如何配置OpenCV的文章里面的操作。
需要注意的是,CMake GUI的下载没走Clash的代理,所以在下载GitHub上面的一些依赖会超时或者下载直接卡住,可以直接去cmake文件里面改下载链接,比如把OpenCV\sources\3rdparty\ffmpeg\ffmpeg.cmake
里面的下载链接前面加上https://ghproxy.com/
来代理加速下载,即变成https://ghproxy.com/https://raw.githubusercontent.com/opencv/opencv_3rdparty/${FFMPEG_BINARIES_COMMIT}/ffmpeg/
这样。
另外,生成解决方案之后有可能是低版本的VS工程,会提示找不到生成工具啥的错误,你需要项目->重定向解决方案
来升级解决方案。
静态链接库Lib的配置
C++工程经常需要通过lib来使用其他人现成的库,比如这篇文章就很详细地介绍了如何配置vs来使用SDL2
库,可以直接拿来参考。
我的总结是:一般先去看这个库是否有官方已经给VS编译好了的lib,比如SDL_image
的GitHub仓库的releases里面就有SDL2_image-devel-2.8.2-VC.zip
这样预先给VS用户准备好的lib,dll和.h文件等等,就很方便。如果有,你只需要将其解压放到合适的位置,然后做下面几件事情(同上面那个SDL2的文章里面所做的那样):
- 添加
include
文件夹(包含.h
的文件夹)路径到项目->项目属性->VC++目录->包含目录
或者项目->项目属性->C/C++->常规->附加包含目录
- 添加
lib/x86
或者lib/x64
(看自己项目需求是x86还是x64,两者的lib不通用)文件夹到项目->项目属性->VC++目录->库目录
或者项目->项目属性->链接器->常规->附加库目录
- 还要把lib的名字,比如
SDL2.lib
和SDL2main.lib
这种,添加到项目->项目属性->链接器->输入->附加依赖项
- 把dll所在目录添加到环境变量
Path
中,同样需要注意x86
和x64
,两个最好都添加上以免后面出问题。另外我好像发现更新完系统环境变量,必须要重启VS,否则不会起作用。被坑惨了
如果很不幸没有官方给VS已经编译好的lib,比如opencv
的x86
,或者lib由于VC版本不同而不能用,就必须要自己来编译源码生成lib。官方的库大概率也是一个CMake项目,根据上面介绍的生成VS工程。注意要根据项目需要,在CMake GUI的Configure
那里选择好是x86
还是x64
。重新生成解决方案之后,生成INSTALL
即可,具体的可以同样可以参考刚才那篇介绍OpenCV配置的文章。
构建
Ctrl+B
或者生成->生成XXX
,要注意当前活动的是不是你想要的项目,如果发现不对劲,改了没效果,生成->重新生成XXX
试试看。
其他杂项
- 关于win32,x86,x64的区别:根据stackoverflow上的这个回答,x86基本可以理解为就是
win32
,即32位程序。x64就是64位程序。