当前位置: 首页 > news >正文

【笔记】Visual Studio 2022 入门指南

Visual Studio 2022 入门指南

目录
  • Visual Studio 2022 入门指南
    • 解决方案(Solution)与项目(Project)
    • 过滤器(Filter)
      • 如何正确配置包含目录?
    • 宏(Macro)
      • 示例
    • 库的使用
      • 静态库(Static Library,.lib
        • 创建
        • 使用
          • 引用
          • 手动配置(不推荐)
      • 动态链接库(Dynamic Link Library,.dll
    • 使用 CMake 自动生成解决方案
      • 手动配置
      • 原生支持
    • 参考资料

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

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

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

需要注意的地方:

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

过滤器(Filter)

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

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

如何正确配置包含目录?

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

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

在 Visual Studio 中选择的目录会被设置为绝对路径,当解决方案发生移动,或者发送给合作者时,就会导致错误。这可以通过 Visual Studio 中提供的来解决。

宏(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

动态库是程序运行时由操作系统加载到内存中的。多个程序可以共享同一个 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 工程实践开发
http://www.vanclimg.com/news/2258.html

相关文章:

  • Visual Studio 2022 入门指南
  • 20250729 之所思 - 人生如梦
  • 2025牛客暑期多校训练营5
  • 【esp32-s3】如何进行WiFi配网
  • 【ESP8266】小电视项目进展记录
  • 【LeetCode 138】力扣算法:随机链表的复制
  • Rocky Linux使用nginx时启用图片压缩
  • 7.29随笔
  • kali安装maven-cnblog
  • 【ESP8266】模组对比(ESP-12F)以及拆盖图
  • log4j2 远程代码执行漏洞复现(CVE-2021-44228)-cnblog
  • Luogu-P3455 [POI 2007] ZAP-Queries
  • PDF转Word免费工具!批量处理PDF压缩,合并, OCR识别, 去水印, 签名等全功能详解
  • npm构建公共组件库
  • 空间复杂度 O(1) 解决力扣的困难算法:k个一组翻转链表
  • HotSpot虚拟机对象探秘
  • 6
  • 【设计模式】创建者模式——1.简单工厂模式
  • 智谱 GLM-4.5 也支持了Claude Code
  • 做题记录
  • 若依
  • Rust 性能优化秘籍:write! 宏让字符串构建提速 75%
  • 基于文件对比的技术写作内容碎片统一与上下文还原方法论
  • Rust 编译优化指南:如何让你的代码更小更快?
  • Windows下CMake安装及环境变量配置
  • Rust 字节处理入门指南:掌握 Vec、Cow 和零拷贝技术
  • 408-OS之阻塞IO和非阻塞IO
  • Python中字符串前“b”,“r”,“u”,“f”的作用
  • (个人思考) 直接使用GE,不用Ability
  • goethereum-地址检查 - Charlie