参考:C/C++网络训练营.vs的作用chatgpt

VS 工程概览

你有没有这样一种感受:想学习 github 上的一些优秀项目时不知道怎么开始;拿到源码后不知道如何运行;项目中密密麻麻的文件是怎么被组织起来的…于是,万里长征路,你就被难在了第一步。确实,学习和使用一个大型项目可能会让人感到困难和无从下手。但是,编译和调试大型项目的过程并不是无法掌握的。下面我将为你提供一些有用的建议和技巧,帮助你更好地理解和使用大型项目。

1)了解项目的结构和依赖关系是非常重要的。在大多数情况下,大型项目都会有一些文档或者说明文件,尤其是 README 文件,它会告诉你项目的基本信息,包括项目的结构、依赖关系、编译和运行方式等等。你可以先仔细阅读这些文件,了解项目的大致框架和组织方式。

2)了解项目的编译和构建过程也是非常重要的。大多数大型项目都会使用一些构建工具来自动化编译和构建过程,例如 Make、CMake等。你需要了解这些工具的基本使用方法,以及项目中使用的具体配置和参数。同时,你也需要掌握编译与链接的基本原理。

3)调试大型项目也是需要一些技巧的。一些常见的调试技巧包括使用调试器、打印日志、使用断言等等。你需要了解这些技巧的基本原理和使用方法,以便更好地定位和解决问题。

4)充分利用 Google 和 chatgpt,尤其是后者,将报错信息发给它,往往会给你极具引导性的答案。

一个好的 IDE 也是项目分析的关键。这里我们先来了解 Visual Studio 是如何组织项目的。

Visual Studio 中,最重要的两个概念是 解决方案项目

解决方案 (Solution) 是一个包含一个或多个项目的 容器它是用来组织、构建和调试项目的一个虚拟项目 。解决方案可以包含多个项目,这些项目可以是不同类型的,例如 C++ 项目、静态或动态链接库等等。在解决方案中,可以对不同项目之间的依赖关系进行管理和设置

项目 (Project) 是一个实际的代码库(lib \ dll)或者可执行文件(.exe)。在 Visual Studio 中,每个项目都有一个独立的项目文件(.vcxproj),其中包含了项目的所有配置信息,包括编译与链接选项。一个项目可以包含多个源文件(source)、头文件(header)、资源文件(resource)等等,它们一起构成了一个可编译的代码库或者可执行文件。

在 Visual Studio 中,解决方案和项目是紧密结合的。一个解决方案可以包含多个项目,这些项目可以共享同一个解决方案的设置和配置。例如,你可以在解决方案中设置所有项目的编译选项、链接选项、调试选项等等。同时,你也可以在项目级别上进行一些独立的配置和设置,例如项目的特定编译选项、依赖项等等。

以 teamtalk 这个在线聊天软件为例(),让我们看看它的结构:

teamtalk 的解决方案下有 11 个项目。直接运行后报错:

错误提示 DuiLib.dll 不是一个有效的可执行程序。这是因为 DuiLib 项目为默认启动项,但它生成的是动态链接库,而动态链接库是无法直接运行的,因此报错。如何知道哪个项目是默认启动项? 看右边窗口,加粗字体的项目即为默认启动项目。一般将生成 exe 的项目设置为默认启动项 。右击任何一个项目,然后点击 Set as Startup Project 选项即可把该项目设置为启动项:

怎么知道一个项目的目标生成文件是库还是可执行程序? 右击项目,点击最下方的 Property,显示如下窗口:
image-20230502140120538

可见,teamtalk 项目的目标生成文件为 .exe 。一般而言,每个项目都有一个目标生成文件,文件名的前缀即为项目名称(图中高亮的上一行,Target Name)。 目标文件的生成路径也可以在图中的 Output Directory 进行修改。既然它的目标文件是 .exe,那就说明可以运行,我们将其设置为启动项,然后运行:

成功运行!


区别几种项目文件

下面看看 teamtalk 项目的项目文件:

在 Visual Studio 中创建一个新的 C++ 项目时,通常会生成三个文件:.vcxproj、.vcxproj.filters 和 .vcxproj.user。这些文件分别用于存储项目的配置信息、过滤器信息和用户特定的配置信息。

1) .vcxproj 文件是 Visual C++ 项目的主要配置文件,它包含了项目的所有配置信息,例如编译选项、链接选项、输出文件、依赖项等等。这个文件是必需的,没有它,你无法编译和构建项目。注意,项目中设置的任何相对路径都是以 .vcxproj 所在路径为基准的。

有些朋友可能还见过 .vcproj 文件。vcxproj 和 vcproj 都是 Visual Studio 项目文件的扩展名,但它们之间有一些区别:
vcproj 是用于 Visual Studio 2002 和 2003 版本的 C++ 项目文件格式,而 vcxproj 是用于 Visual Studio 2005 及更高版本的 C++ 项目文件格式。因此,vcxproj 是 vcproj 的升级版,它使用了更先进的 XML 格式来表示项目文件。

2) .vcxproj.filters 文件是 Visual C++ 项目的过滤器配置文件,它用于组织和管理项目中的源文件、头文件、资源文件等。这个文件不是必需的,但是它可以帮助你更好地组织和管理项目中的文件,使代码更易于维护和重用。具体而言,它指定哪些文件类型进入解决方案资源管理器中的逻辑文件夹。 在下图中, 某些文件位于 “Main” 文件夹下,某些文件位于 “ProjectFils” 文件夹下。 此位置由筛选器文件控制:

将 .vcxproj.filters 文件删除后,显示如下:

结果散乱一团。所以 .vcxproj.filters 最好保留(一并添加到版本控制中)。

另外值得一提的是,我们将现有的文件添加到项目中的 逻辑 文件夹来一并管理,但这并不改变实际的目录结构

3) .vcxproj.user 文件是用户特定的配置文件,它包含了用户特定的配置信息,比如窗体和鼠标位置等。这个文件是可选的,它可以让不同的用户在同一个项目中使用不同的配置,以适应不同的开发需求。此文件无需保存到版本控制中。

4) .vs 文件夹(一般是隐藏状态),通常存放在解决方案的目录下,用来存储当前用户在解决方案中的工作配置,具体包括 VS 关闭前最后的窗口布局、最后打开的选项卡/操作记录/文件文档、某些自定义配置/开发环境、调试断点等这类设置信息和状态。 这样每当用户关闭解决方案后再重新打开,就能继续之前的工作状态。因此也无需保存到版本控制中。


基本操作

1)编译整个解决方案
有时候右击 solution 然后点击 build 后,不会编译 solution 下的所有项目,这就很坑,调了半天原来压根没编译。调整方法如下:

2)查看构建顺序
某些库项目可能依赖另外一些库,通过查看构建顺序,我们能够更有针对性地解决库的编译问题,查看方法如下:

这样,当我们单独编译 network 时出了问题,就可以去检查 network 是否依赖了 GifSmiley 和 httpclient,并针对性地去排查错误。

3)头文件搜索目录
在Visual Studio中,头文件的搜索顺序如下:

  1. 当前项目目录:Visual Studio 首先会在当前项目目录中搜索头文件,如果头文件存在于该目录中,则会直接使用该头文件。
  2. 系统目录:如果头文件不在当前项目目录中,则会在系统目录中搜索。这些系统目录包括 Visual Studio 安装目录、Windows SDK 安装目录、以及其他系统级目录。
  3. 环境变量:如果头文件不在系统目录中,则会在环境变量中指定的目录中搜索。例如,如果你在环境变量中设置了 INCLUDE 变量,则 Visual Studio 会在该目录中搜索头文件。
  4. 项目属性:如果头文件仍然无法找到,则会在项目属性中指定的搜索路径里搜寻。

在项目属性中指定头文件的搜寻路径是高频使用的方法,必须掌握:

5)库搜索目录
库文件的搜索顺序如下:

  1. 当前项目目录。
  2. 系统目录。
  3. 环境变量。例如,如果你在环境变量中设置了“LIB”变量,则 VS 会在该目录中搜索库文件。
  4. 项目属性。
  5. 引用的项目。如果你的项目引用了其他项目,则 VS 会在这些项目的输出目录中搜索库文件。

在项目属性中设置库的搜索目录,方法如下:

也可以设置依赖项目,方法如下:

6)定义宏
有时候给你的整个项目定义宏会方便许多,如下:

7)库依赖
这也是最常用的方法之一,我们的项目经常会依赖某些库(lib 或 dll),添加方法如下:

实际上,上面我们设置的搜索目录、库依赖和宏定义都化作了命令行来指导编译和链接:


OK,暂时先到这里,后面我们将会编译练习 teamtalk、Nginx .

文章作者: 极简
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 后端技术分享
工程组织
喜欢就支持一下吧