Visual Studio 2022 入门指南
Visual Studio 2022 入门指南
解决方案(Solution)与项目(Project)
一个解决方案是用于组织和管理一个活多个相关联项目的容器。这套结构旨在将一个复杂的实际问题,分解成多个功能独立的模块(项目)来开发和管理。
- 解决方案(
.sln文件):这是最高层级的组织单位,它定义了所包含的项目以及它们之间的依赖关系和构建配置。当你打开一个.sln文件时,Visual Studio 会加载整个工作区。 - 项目(
.vcxproj、csproj等文件):每个项目对应一个独立的模块,最终会生成一个可执行文件(.exe)、一个静态库(.lib)或一个动态链接库(.dll)。
需要注意的地方:
- 单一启动项目:在一个解决方案中,通常只有一个项目被设置为启动项目。启动项目是点击 “开始调试”(F5)时,Visual Studio 将会编译和运行的项目。可以在解决方案资源管理器中右键点击不同的项目,选择 "设为启动项目"。
- “将解决方案和项目放在同一目录中”:
- 勾选:解决方案文件(
.sln)和项目文件(例如.vcxproj)会存放在同一个文件夹中。这对于只有一个或少数几个项目的简单解决方案来说,目录结构更扁平、更清晰。 - 不勾选(默认):Visual Studio 会创建一个顶层文件夹来存放解决方案文件(
.sln),然后在该文件夹下为每一个项目再创建一个独立的子文件夹。当解决方案包含多个项目时,这种结构更加有条理,是更推荐的做法。
- 勾选:解决方案文件(
每一个实际的工程都是为了解决相应的实际问题,这里所说的工程便是 Visual Studio 2022 中所说的解决方案。
在每一个实际问题的解决过程中,我们可能使用不同的工具、不同的方法。而在软件开发中,一个实际问题的解决,通常需要使用不同的模块,这里的模块便是 Visual Studio 2022 中所说的项目。
所以,一个实际问题只能有一个解决方案(逻辑上来说),但解决方案可以包含多个项目。
[!important]
在创建项目时,勾选将解决方案和项目放在同一目录中。
过滤器(Filter)
过滤器(Filter)是 Visual Studio 解决方案资源管理器中的一个虚拟文件夹结构。它的主要作用是帮助开发者组织和分类源文件、头文件等,使项目看起来更整洁。开发者可以自由地创建、重命名或删除过滤器,这不会影响磁盘上文件的实际位置。
而对于编译器(例如 MSVC、GCC 等)在编译代码时,只关心真实的目录结构,而非过滤器中的配置。所以当编译器报错 “无法打开源文件” 或 “找不到头文件” 之类的错误时,问题几乎总是出在项目属性的路径配置上,而不是解决方案资源管理器的过滤器结构。
如何正确配置包含目录?
当项目需要引入外部头文件(例如来自另一个项目货第三方库)时,必须明确告知编译器去哪里查找这些文件。
- 在解决方案资源管理器中右键点击项目,选择属性。
- 确保顶部的配置和平台设置正确。
- 导航到 C/C++ \(\rightarrow\) 常规。
- 在附加包含目录字段中,添加所需头文件所在的真实目录路径。
在 Visual Studio 中选择的目录会被设置为绝对路径,当解决方案发生移动,或者发送给合作者时,就会导致错误。这可以通过 Visual Studio 中提供的宏来解决。
所有的文件,即头文件和源文件都需要加入到 Visual Studio 2022 的项目中。
Visual Studio 2022 中的过滤器与真实的目录结构是两码事,而编译器在编译时依赖的是真实的目录结构。
编译器报错找不到某个或某些路径时,需要去 Visual Studio 2022 中指定查找目录。
[!important]
项目 \(\rightarrow\) 属性 \(\rightarrow\) 选择配置和平台 \(\rightarrow\) C/C++ \(\rightarrow\) 常规 \(\rightarrow\) 附加包含目录
需要为每一个项目进行配置
宏(Macro)
Visual Studio 提供了一系列预定义的宏(Macro),这些宏会在构建时被动态地解析为具体的路径。
常用宏变量:
| 宏 | 描述 |
|---|---|
$(SolutionDir) |
解决方案文件(.sln)所在的目录 |
$(ProjectDir) |
当前项目文件(.vcxproj)所在的目录 |
$(OutDir) |
最终输出文件(如 .exe、.dll)的存放目录 |
$(IntDir) |
编译过程中产生的中间文件(如 .obj)的存放目录 |
$(Configuration) |
当前的构建配置名称,如 Debug 或 Release |
$(Platform) |
当前的构建平台名称,如 x64 或 Win32 |
示例
假设解决方案目录结构如下:
MySolution/
├── MySolution.sln
├── ProjectA/
│ └── ProjectA.vcxproj
└── Libraries/
└── MyLib/
└── include/
└── my_header.h
如果 ProjectA 需要包含 my_header.h,则可以在 ProjectA 的 “附加包含目录” 中设置为:$(SolutionDir)\Libraries\MyLib\include。这样一来,即使将整个 MySolution 文件夹移动到其他位置,这个相对路径依然有效。
库的使用
静态库(Static Library,.lib)
静态库是在链接阶段被并入到目标程序中的。最终生成的可执行文件会包含静态库的所有代码,因此文件体积较大,但运行时不依赖外部文件。
创建
在解决方案中右键点击 “解决方案” \(\rightarrow\) 添加 \(\rightarrow\) 新建项目 \(\rightarrow\) 静态库
使用
引用
- 在需要使用此库的项目上,右键点击引用
- 选择添加引用,然后在弹出的对话框中勾选所需的静态库项目
这是推荐的方式,原因如下:
- 它会自动设置链接器的输入,确保链接器能够找到库文件
- 它会自动创建项目依赖项,保证在编译主项目之前,静态库项目总是被优先编译
- 它还会自动将静态库的头文件目录添加到主项目的附加包含目录中,让开发者能够直接
#include
手动配置(不推荐)
如果引用的库是一个已经编译好、非解决方案内的 .lib 文件,则需要手动配置:
- 附加库目录:在项目属性的链接器 \(\rightarrow\) 常规中,添加
.lib文件所在的目录。 - 附加依赖项:在项目属性的链接器 \(\rightarrow\) 输入中,添加
.lib文件的具体名称(例如libtest.lib)
动态链接库(Dynamic Link Library,.dll)
动态库是程序运行时由操作系统加载到内存中的。多个程序可以共享同一个 DLL,从而节省磁盘空间和内存。项目生成时会同时产生一个 .dll 文件(运行时需要)和一个 .lib 文件(链接时需要)。
注意事项:
- 导出与导入:从 DLL 中暴露函数或类给其他项目使用,需要使用
__declspec(dllexport)关键字。而在使用该 DLL 的项目中,则需要使用__declspc(dllimport)来声明这些函数或类。 - 运行时环境:当运行依赖于 DLL 的程序时,操作系统必须能够找到这个
.dll文件。通常由以下几种方式:- 将
.dll文件放置在与可执行文件(.exe)相同的目录下 - 将
.dll文件所在的目录添加到系统的PATH环境变量中。 - 在 Visual Studio 中进行调试时,它通常会自动处理好路径问题。
- 将
使用 CMake 自动生成解决方案
对于跨平台项目或大型复杂项目,直接使用 Visual Studio 的项目文件进行管理可能会变得非常繁琐。CMake 是一个强大的、开源的构建系统生成工具,它可以根据简单的配置文件(CMakeLists.txt)自动生成适用与多种平台和 IDE 的原生构建环境,包括 Visual Studio 的 .sln 和 .vcxproj 文件。
手动配置
- 为项目的根目录以及各个子模块(库、可执行文件)编写
CMakeLists.txt文件。 - 创建一个独立的构建目录(通常命名为
build),以保持源码树的干净。 - 在
build目录中运行 CMake,指令通常为cmake ..,它会查找上一级目录的CMakeLists.txt并生成构建文件。 - 最后,用 Visual Studio 打开在
build中生成的.sln文件。
原生支持
从 Visual Studio 2017 开始,Visual Studio 提供了对 CMake 的原生集成支持。
可以直接用 Visual Studio 打开一个包含 CMakeLists.txt 的文件节哀,而无需手动运行 cmake 命令和打开生成的 .sln 文件。Visual Studio 会自动在后台完成这一切,并提供完整的智能提示、构建和调试支持。
这对于使用 CMake 的项目来说,是目前最便捷的开发方式。
参考资料
Visual Studio 2022 入门指南的更多相关文章
- [翻译]正式宣布 Visual Studio 2022
原文: [Visual Studio 2022] 首先,我们要感谢正在阅读这篇文章的你,我们所有的产品开发都始于你也止于你,无论你是在开发者社区上发帖,还是填写了调查问卷,还是向我们发送了反馈意见,或 ...
- 它来了!!!有史以来第一个64位Visual Studio(2022)预览版将在今夏发布!
美国时间2021年4月19日,微软产品研发部一位负责人Amanda Silver在其博客上发布一则<Visual Studio 2022>的消息,表示将在今年(2021年)夏天发布Visu ...
- .NET6系列:微软正式宣布Visual Studio 2022
系列目录 [已更新最新开发文章,点击查看详细] 首先,我们要感谢正在阅读这篇文章的你,我们所有的产品开发都始于你也止于你,无论你是在开发者社区上发帖,还是填写了调查问卷,还是向我们发送了反馈意 ...
- .NET6系列:Visual Studio 2022 线路图
系列目录 [已更新最新开发文章,点击查看详细] 在上一篇博客<Visual Studio 2022>中介绍了VS2022的性能改进与重要功能.本文主要介绍在 Visual Stud ...
- 微软发布了Visual Studio 2022 Preview 1 以及.NET 6 Preview 5
Microsoft 今天宣布了Visual Studio 2022 的第一个预览版,并且同时也发布了.NET 6 Preview 5. https://devblogs.microsoft.com/v ...
- Visual Studio 2022 Preview 1 和.NET 6 Preview 5 正式发布
具有里程碑意义的Visual Studio 2022 Preview 1正式发布,重点是64位,而没有增加新功能,并且同时也发布了.NET 6 Preview 5. https://devblogs. ...
- 乘风破浪,遇见Visual Studio 2022预览版(Preview),宇宙最强开发者工具首次迎来64位版本
简介 众所周知,我们从官方新闻来看,对Visual Studio 2022最大的期待莫过于:其是首个64位的Visual Studio,这个宇宙最强开发者工具一脚迈入了新的阶段. https://vi ...
- C#比较两个对象是否为同一个对象。 Visual Studio调试器指南---多线程应用程序调试(一)
两个对象是否为同一个对象:是看两个对象是否指向堆中的同一块内存. 1.使用object.ReferenceEquals() class Program { static void Main(strin ...
- Visual Studio 2022 预览版3 最新功能解说
我们很高兴地宣布Visual Studio 2022 的第三个预览版问世啦!预览版3 提供了更多关于个人和团队生产力.现代开发和持续创新等主题的新功能.在本文中,我们将重点介绍Visual Studi ...
- 微软发布了Visual Studio 2022 RC版,并将在11月8日发布正式版
微软今天发布了Visual Studio 2022 最接近正式发布的RC版本,同时宣布在11月8日发布正式版,届时将在线上发布虚拟的发布活动,具体参见:https://devblogs.microso ...
随机推荐
- trae开发的win10端口占用检测工具
前言 首先,强烈安利字节开发的工具:https://www.trae.com.cn/ 以下代码均由此工具生成. linux 中可以使用 lsof -i:端口号 查看端口占用进程,并使用kill指令杀死 ...
- @FeignClient注解配置局部超时时间、OkHttp长连接和SocketTimeoutException异常解决办法
问题描述:open feign配置OKhttp调用远程API,连续调用次数较少时,一切正常,次数非常多时(例如,连续请求600次)就抛出java.net.SocketTimeoutException: ...
- JSON格式化和压缩成一行
JSON格式化和压缩成一行 摘要:把JSON字符串压缩成一行,即去掉中的空格.回车.换行符.制表符等:格式化JSON, 易于阅读. JSON(JavaScript Object Notation, ...
- IDEA jrebel热部署插件破解-降级
前言 jrebel热部署插件的破解方式我们一般使用https://jrebel.qekang.com/ 但是这个方式破解只支持到的jrebel热部署插件版本为2022.4.1 需要最新版本的破解请参考 ...
- GHCTF 2025 web 萌新初探wp
ctf萌新第一次写wp,如有错误请师傅们指出 [GHCTF 2025]SQL??? 打开靶机是一个用户查询的页面,结合题目名称猜测是sql注入,但是常规方法都试过了没办法注入,当时也是很懵逼,后来一个 ...
- 【Java并发编程】面试必备之线程池
什么是线程池 是一种基于池化思想管理线程的工具. 池化技术:池化技术简单点来说,就是提前保存大量的资源,以备不时之需.比如我们的对象池,数据库连接池等. 线程池好处 我们为什么要使用线程池,直接new ...
- ABAP基础三——DIALOG整体
本来想模拟VA01的,后来想想ME21N也很经典,所以就把一些常见的组建都放上面了. 效果图如下: 1.整体设计就是按 抬头(1) + 项目(N) + 伙伴(N) + 相关数据的tabstrip(N ...
- 微软开源 Azure Functions MCP Extension
Azure Functions MCP Extension 是微软推出的开源扩展库,旨在将 Azure Functions 与模型上下文协议(Model Context Protocol, MCP) ...
- Centos7在原有磁盘上磁盘扩容
如下示例使用VMWare虚拟化软件给虚拟centos7系统进行相关磁盘扩容 1.查看目前磁盘容量 2.VMWare给虚拟系统扩展空间 注意在虚拟系统关机情况下进行 3.查看扩容后磁盘情况 4.创建磁盘 ...
- Java--连接池和分页
连接池 分析: 涉及频繁的连接的打开.关闭,影响程序的运行效率! 连接管理: 预先创建一组连接,有的时候每次取出一个: 用完后,放回: 学习连接池: a. 自定义一个连接池 b. 学习优秀的连接池组件 ...