Visual Studio 2022 入门指南

解决方案(Solution)与项目(Project)

一个解决方案是用于组织和管理一个活多个相关联项目的容器。这套结构旨在将一个复杂的实际问题,分解成多个功能独立的模块项目)来开发和管理。

  • 解决方案.sln 文件):这是最高层级的组织单位,它定义了所包含的项目以及它们之间的依赖关系和构建配置。当你打开一个 .sln 文件时,Visual Studio 会加载整个工作区。
  • 项目.vcxprojcsproj 等文件):每个项目对应一个独立的模块,最终会生成一个可执行文件(.exe)、一个静态库(.lib)或一个动态链接库(.dll)。

需要注意的地方:

  • 单一启动项目:在一个解决方案中,通常只有一个项目被设置为启动项目启动项目是点击 “开始调试”(F5)时,Visual Studio 将会编译和运行的项目。可以在解决方案资源管理器中右键点击不同的项目,选择 "设为启动项目"。
  • 将解决方案和项目放在同一目录中”:
    • 勾选:解决方案文件(.sln)和项目文件(例如 .vcxproj)会存放在同一个文件夹中。这对于只有一个或少数几个项目的简单解决方案来说,目录结构更扁平、更清晰。
    • 不勾选(默认):Visual Studio 会创建一个顶层文件夹来存放解决方案文件(.sln),然后在该文件夹下为每一个项目再创建一个独立的子文件夹。当解决方案包含多个项目时,这种结构更加有条理,是更推荐的做法

每一个实际的工程都是为了解决相应的实际问题,这里所说的工程便是 Visual Studio 2022 中所说的解决方案

在每一个实际问题的解决过程中,我们可能使用不同的工具、不同的方法。而在软件开发中,一个实际问题的解决,通常需要使用不同的模块,这里的模块便是 Visual Studio 2022 中所说的项目

所以,一个实际问题只能有一个解决方案(逻辑上来说),但解决方案可以包含多个项目

[!important]

在创建项目时,勾选将解决方案和项目放在同一目录中

过滤器(Filter)

过滤器Filter)是 Visual Studio 解决方案资源管理器中的一个虚拟文件夹结构。它的主要作用是帮助开发者组织和分类源文件、头文件等,使项目看起来更整洁。开发者可以自由地创建、重命名或删除过滤器,这不会影响磁盘上文件的实际位置。

而对于编译器(例如 MSVC、GCC 等)在编译代码时,只关心真实的目录结构,而非过滤器中的配置。所以当编译器报错 “无法打开源文件” 或 “找不到头文件” 之类的错误时,问题几乎总是出在项目属性的路径配置上,而不是解决方案资源管理器的过滤器结构。

如何正确配置包含目录?

当项目需要引入外部头文件(例如来自另一个项目货第三方库)时,必须明确告知编译器去哪里查找这些文件。

  1. 解决方案资源管理器中右键点击项目,选择属性
  2. 确保顶部的配置平台设置正确。
  3. 导航到 C/C++ \(\rightarrow\) 常规
  4. 附加包含目录字段中,添加所需头文件所在的真实目录路径

在 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) 当前的构建配置名称,如 DebugRelease
$(Platform) 当前的构建平台名称,如 x64Win32

示例

假设解决方案目录结构如下:

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 文件,则需要手动配置:

  1. 附加库目录:在项目属性的链接器 \(\rightarrow\) 常规中,添加 .lib 文件所在的目录。
  2. 附加依赖项:在项目属性的链接器 \(\rightarrow\) 输入中,添加 .lib 文件的具体名称(例如 libtest.lib

动态链接库(Dynamic Link Library,.dll

动态库是程序运行时由操作系统加载到内存中的。多个程序可以共享同一个 DLL,从而节省磁盘空间和内存。项目生成时会同时产生一个 .dll 文件(运行时需要)和一个 .lib 文件(链接时需要)。

注意事项:

  • 导出与导入:从 DLL 中暴露函数或类给其他项目使用,需要使用 __declspec(dllexport) 关键字。而在使用该 DLL 的项目中,则需要使用 __declspc(dllimport) 来声明这些函数或类。
  • 运行时环境:当运行依赖于 DLL 的程序时,操作系统必须能够找到这个 .dll 文件。通常由以下几种方式:
    1. .dll 文件放置在与可执行文件(.exe)相同的目录下
    2. .dll 文件所在的目录添加到系统的 PATH 环境变量中。
    3. 在 Visual Studio 中进行调试时,它通常会自动处理好路径问题。

使用 CMake 自动生成解决方案

对于跨平台项目或大型复杂项目,直接使用 Visual Studio 的项目文件进行管理可能会变得非常繁琐。CMake 是一个强大的、开源的构建系统生成工具,它可以根据简单的配置文件(CMakeLists.txt)自动生成适用与多种平台和 IDE 的原生构建环境,包括 Visual Studio 的 .sln.vcxproj 文件。

手动配置

  1. 为项目的根目录以及各个子模块(库、可执行文件)编写 CMakeLists.txt 文件。
  2. 创建一个独立的构建目录(通常命名为 build),以保持源码树的干净。
  3. build 目录中运行 CMake,指令通常为 cmake ..,它会查找上一级目录的 CMakeLists.txt 并生成构建文件。
  4. 最后,用 Visual Studio 打开在 build 中生成的 .sln 文件。

原生支持

从 Visual Studio 2017 开始,Visual Studio 提供了对 CMake 的原生集成支持。

可以直接用 Visual Studio 打开一个包含 CMakeLists.txt 的文件节哀,而无需手动运行 cmake 命令和打开生成的 .sln 文件。Visual Studio 会自动在后台完成这一切,并提供完整的智能提示、构建和调试支持。

这对于使用 CMake 的项目来说,是目前最便捷的开发方式。

参考资料

  1. 工程课代表——Visual Studio 工程实践开发

Visual Studio 2022 入门指南的更多相关文章

  1. [翻译]正式宣布 Visual Studio 2022

    原文: [Visual Studio 2022] 首先,我们要感谢正在阅读这篇文章的你,我们所有的产品开发都始于你也止于你,无论你是在开发者社区上发帖,还是填写了调查问卷,还是向我们发送了反馈意见,或 ...

  2. 它来了!!!有史以来第一个64位Visual Studio(2022)预览版将在今夏发布!

    美国时间2021年4月19日,微软产品研发部一位负责人Amanda Silver在其博客上发布一则<Visual Studio 2022>的消息,表示将在今年(2021年)夏天发布Visu ...

  3. .NET6系列:微软正式宣布Visual Studio 2022

    系列目录     [已更新最新开发文章,点击查看详细] 首先,我们要感谢正在阅读这篇文章的你,我们所有的产品开发都始于你也止于你,无论你是在开发者社区上发帖,还是填写了调查问卷,还是向我们发送了反馈意 ...

  4. .NET6系列:Visual Studio 2022 线路图

    系列目录     [已更新最新开发文章,点击查看详细] 在上一篇博客<Visual Studio 2022>中介绍了VS2022的性能改进与重要功能.本文主要介绍在 Visual Stud ...

  5. 微软发布了Visual Studio 2022 Preview 1 以及.NET 6 Preview 5

    Microsoft 今天宣布了Visual Studio 2022 的第一个预览版,并且同时也发布了.NET 6 Preview 5. https://devblogs.microsoft.com/v ...

  6. Visual Studio 2022 Preview 1 和.NET 6 Preview 5 正式发布

    具有里程碑意义的Visual Studio 2022 Preview 1正式发布,重点是64位,而没有增加新功能,并且同时也发布了.NET 6 Preview 5. https://devblogs. ...

  7. 乘风破浪,遇见Visual Studio 2022预览版(Preview),宇宙最强开发者工具首次迎来64位版本

    简介 众所周知,我们从官方新闻来看,对Visual Studio 2022最大的期待莫过于:其是首个64位的Visual Studio,这个宇宙最强开发者工具一脚迈入了新的阶段. https://vi ...

  8. C#比较两个对象是否为同一个对象。 Visual Studio调试器指南---多线程应用程序调试(一)

    两个对象是否为同一个对象:是看两个对象是否指向堆中的同一块内存. 1.使用object.ReferenceEquals() class Program { static void Main(strin ...

  9. Visual Studio 2022 预览版3 最新功能解说

    我们很高兴地宣布Visual Studio 2022 的第三个预览版问世啦!预览版3 提供了更多关于个人和团队生产力.现代开发和持续创新等主题的新功能.在本文中,我们将重点介绍Visual Studi ...

  10. 微软发布了Visual Studio 2022 RC版,并将在11月8日发布正式版

    微软今天发布了Visual Studio 2022 最接近正式发布的RC版本,同时宣布在11月8日发布正式版,届时将在线上发布虚拟的发布活动,具体参见:https://devblogs.microso ...

随机推荐

  1. trae开发的win10端口占用检测工具

    前言 首先,强烈安利字节开发的工具:https://www.trae.com.cn/ 以下代码均由此工具生成. linux 中可以使用 lsof -i:端口号 查看端口占用进程,并使用kill指令杀死 ...

  2. @FeignClient注解配置局部超时时间、OkHttp长连接和SocketTimeoutException异常解决办法

    问题描述:open feign配置OKhttp调用远程API,连续调用次数较少时,一切正常,次数非常多时(例如,连续请求600次)就抛出java.net.SocketTimeoutException: ...

  3. JSON格式化和压缩成一行

    JSON格式化和压缩成一行 摘要:把JSON字符串压缩成一行,即去掉中的空格.回车.换行符.制表符等:格式化JSON, 易于阅读.   JSON(JavaScript Object Notation, ...

  4. IDEA jrebel热部署插件破解-降级

    前言 jrebel热部署插件的破解方式我们一般使用https://jrebel.qekang.com/ 但是这个方式破解只支持到的jrebel热部署插件版本为2022.4.1 需要最新版本的破解请参考 ...

  5. GHCTF 2025 web 萌新初探wp

    ctf萌新第一次写wp,如有错误请师傅们指出 [GHCTF 2025]SQL??? 打开靶机是一个用户查询的页面,结合题目名称猜测是sql注入,但是常规方法都试过了没办法注入,当时也是很懵逼,后来一个 ...

  6. 【Java并发编程】面试必备之线程池

    什么是线程池 是一种基于池化思想管理线程的工具. 池化技术:池化技术简单点来说,就是提前保存大量的资源,以备不时之需.比如我们的对象池,数据库连接池等. 线程池好处 我们为什么要使用线程池,直接new ...

  7. ABAP基础三——DIALOG整体

    本来想模拟VA01的,后来想想ME21N也很经典,所以就把一些常见的组建都放上面了. 效果图如下: 1.整体设计就是按  抬头(1) + 项目(N) + 伙伴(N) + 相关数据的tabstrip(N ...

  8. 微软开源 Azure Functions MCP Extension

    Azure Functions MCP Extension 是微软推出的开源扩展库,旨在将 Azure Functions 与模型上下文协议(Model Context Protocol, MCP) ...

  9. Centos7在原有磁盘上磁盘扩容

    如下示例使用VMWare虚拟化软件给虚拟centos7系统进行相关磁盘扩容 1.查看目前磁盘容量 2.VMWare给虚拟系统扩展空间 注意在虚拟系统关机情况下进行 3.查看扩容后磁盘情况 4.创建磁盘 ...

  10. Java--连接池和分页

    连接池 分析: 涉及频繁的连接的打开.关闭,影响程序的运行效率! 连接管理: 预先创建一组连接,有的时候每次取出一个: 用完后,放回: 学习连接池: a. 自定义一个连接池 b. 学习优秀的连接池组件 ...