Kika's
Blog
图片简介 | CC BY 4.0 | 换一张

Visual Studio C++环境配置 快速上手

2024-02-16

为了开发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中的12Visual 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_imageGitHub仓库的releases里面就有SDL2_image-devel-2.8.2-VC.zip这样预先给VS用户准备好的lib,dll和.h文件等等,就很方便。如果有,你只需要将其解压放到合适的位置,然后做下面几件事情(同上面那个SDL2的文章里面所做的那样):

  1. 添加include文件夹(包含.h的文件夹)路径到项目->项目属性->VC++目录->包含目录或者项目->项目属性->C/C++->常规->附加包含目录
  2. 添加lib/x86或者lib/x64(看自己项目需求是x86还是x64,两者的lib不通用)文件夹到项目->项目属性->VC++目录->库目录或者项目->项目属性->链接器->常规->附加库目录
  3. 还要把lib的名字,比如SDL2.libSDL2main.lib这种,添加到项目->项目属性->链接器->输入->附加依赖项
  4. 把dll所在目录添加到环境变量Path中,同样需要注意x86x64,两个最好都添加上以免后面出问题。另外我好像发现更新完系统环境变量,必须要重启VS,否则不会起作用。被坑惨了

如果很不幸没有官方给VS已经编译好的lib,比如opencvx86,或者lib由于VC版本不同而不能用,就必须要自己来编译源码生成lib。官方的库大概率也是一个CMake项目,根据上面介绍的生成VS工程。注意要根据项目需要,在CMake GUI的Configure那里选择好是x86还是x64。重新生成解决方案之后,生成INSTALL即可,具体的可以同样可以参考刚才那篇介绍OpenCV配置的文章

构建

Ctrl+B或者生成->生成XXX,要注意当前活动的是不是你想要的项目,如果发现不对劲,改了没效果,生成->重新生成XXX试试看。

其他杂项