65.9K
CodeProject 正在变化。 阅读更多。
Home

DWinLib 构建过程

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2021年1月16日

CPOL

8分钟阅读

viewsIcon

5827

downloadIcon

213

DWinLib 程序(使用或不使用库)的构建过程概述

引言

本文概述了构建一个 DWinLib 程序所需的步骤。如果您不熟悉在 Visual Studio 中创建项目和解决方案,您可能会在此找到一些有用的信息。

首先,将以下 DWinLib 和示例的 zip 文件解压到硬盘上的一个方便的位置。我会在“D:\Programs”目录下创建该目录并将它们放置在此。选择该位置的原因已在我 DWinLib 6: Pretty WinAPI Incorporation 文章中进行了概述。

有两种方法可以创建 DWinLib 程序。您可以从头开始将所有文件拉入一个项目,或者可以使用 DWinLib 库。这里将概述这两种方法。

从零开始构建 DWinLib 程序

这两种方法中,从零开始构建 DWinLib 程序是最简单的。要开始,您需要知道您想创建什么类型的项目,以及在哪里创建它。

这些示例假设 zip 文件已解压到“D:\Programs”。在这种情况下,我将选择(并非随意地)重现 MdiDwlDockWork 示例。新项目将位于“D:\Programs\MyProgs\AwesomeProg”,因此请创建该目录,并将“D:\Programs\MyProgs\DWinLibExamples\MdiDwlDockWork”(不包括“VS_FILES”子目录)中的所有文件复制到新的“AwesomeProg”目录。

打开 Visual Studio 并创建一个全新的、完全空白的 C++ 项目。将其放置在“D:\Programs\MyProgs\AwesomeProg”,并将其命名为“AwesomeProg”。选中将解决方案和项目放在同一目录的复选框,并确保选择“创建新解决方案”下拉项。按“创建”按钮。

处理完成后,Visual Studio 将显示一个空白屏幕,如果默认显示,则会显示解决方案资源管理器。如果未显示,请通过“视图”菜单或“Ctrl + Alt + L”将其显示出来。

您可以根据需要将文件组织到解决方案资源管理器的筛选器中,但在此示例中,我将删除“头文件”筛选器,将“资源文件”筛选器重命名为“DWinLib”,并保留“源文件”筛选器原样。

然后,在 Windows 资源管理器中,将“D:\Programs\MyProgs\AwesomeProg”中的所有文件(不包括任何子目录)拖到“源文件”筛选器上。然后,在 Windows 资源管理器中,导航到“D:\Programs\LibsAndUtils\DWinLib”,并将所有文件(再次,不包括其中的目录)拖到“DWinLib”筛选器上。

现在,我们将所有文件都放到了 Visual Studio 中,但还有一些工作要做。如果您按下“本地 Windows 调试器”按钮,然后输入错误开始出现在输出中后按下“Ctrl + Break”,您会看到 Visual Studio 抱怨

  • “无法打开 include 文件: 'PrecompiledHeaders.h': 没有这样的文件或目录”

要解决此问题,请在解决方案资源管理器中右键单击“AwesomeProg”项目,从菜单底部选择“属性”,然后导航到 配置属性 -> C/C++ -> 预编译头,并将“预编译头”行更改为“使用 (/Yu)”,并将“预编译头文件”行中的文件名从“stdafx.h”更改为“PrecompiledHeaders.h”。确保在左上角的配置下拉菜单中选择了“所有配置”,然后按“确定”。

之后,在解决方案资源管理器中右键单击“PrecompiledHeaders.cpp”文件,并在“预编译头”行上选择“创建 (/Yc)”。

再次尝试构建程序,您会得到

  • …无法打开 include 文件: 'DwlTypedefs.h'…

这是因为尽管 Visual Studio 知道我们添加的文件放置在哪里,但它需要我们明确地指定这些位置供其进行编译和链接。所以,在解决方案资源管理器中右键单击“AwesomeProg”项目,选择底部的“属性”,然后导航到 配置属性 -> C/C++ -> 常规 位置。确保左上角的下拉菜单中选择了“所有配置”,然后将 DWinLib 目录和程序目录添加到“其他包含目录”行。假设您的设置与我的相同,它们是

  • D:\Programs\LibsAndUtils\DWinLib
  • D:\Programs\MyProgs\AwesomeProg

这样做,“其他包含目录”行将变为“D:\Programs\MyProgs\AwesomeProg;D:\Programs\LibsAndUtils\DWinLib;%(AdditionalIncludeDirectories)”,您可以将其粘贴进去,而不是通过下拉菜单添加。

按“确定”,然后尝试重新运行程序。您会得到一堆错误。编译完成后(如果您等到那个时候),错误列表中的顶部“红色 X”将是“错误 C2440 'initializing': 无法从 'const wchar_t [17]' 转换为 'TCHAR *'”。

DWinLib 最初创建时,它使用了 Windows 的 'TCHAR' 宏,以便轻松使用 UNICODE多字节字符集。这与更严格的默认 Visual Studio 设置相结合,导致了这个实际上并非错误的错误。为了绕过它,请回到 配置属性 -> C/C++ -> 语言,并将“一致性模式”更改为“”。

重新生成,Visual Studio 会输出一个错误“'clientWindowC': 未声明的标识符”。对于这个错误,我们只需要告诉 DWinLib 我们正在构建一个 MDI 应用程序。要做到这一点,请转到 配置属性 -> C/C++ -> 预处理器,并将“DWL_MDI_APP”添加到“预处理器定义”。

当解决方案再次重新生成时,您会收到一个新错误:“LNK2019 无法解析的外部符号 _main...”。当我们创建 Visual Studio 项目为空白 C++ 项目时,它默认将其设置为控制台应用程序。要更改这一点,修复方法在 配置属性 -> C/C++ -> 链接器 中,其中子系统需要更改为 Windows。有了这个设置,当按下本地 Windows 调试按钮时,程序最终就会出现。

恭喜!您可以开始添加您想要的其他功能了!如果您需要一个可以比较的作品,这里有一个可用的项目 zip 文件。它已设置为使用本文概述的“D:\...”子目录,因此不利于同时比较两个项目。(要做到这一点,您需要创建一个位于“D:\Programs\MyProgs\AwesomeProg”以外的子目录的版本。)

使用 DWinLib 库构建 DWinLib 程序

构建 DWinLib 程序的第二种方法是使用 DWinLib 作为库。要使用库,您必须像上面告诉 Visual Studio 所有文件和设置一样,让 Visual Studio 知道它的存在。

首先,让我们重新创建 MdiDwlPwcStudio 项目。所以,在“D:\Programs\MyProgs\DwlPwcStudio”创建一个目录。将“D:\Programs\MyProgs\DWinLibExamples\MdiDwlPwcStudio”中的文件复制到其中,但排除其中包含的子目录。然后在 Visual Studio 中,在“D:\Programs\MyProgs\DwlPwcStudio”创建一个新的空白 C++ 项目,命名为“DwlPwcStudio”,并将新 DwlPwcStudio 文件夹中的文件拖到解决方案资源管理器“源文件”筛选器中。(如果您愿意,可以删除其他筛选器。)

这次,我们不必将 DWinLib 文件拖到项目中。相反,我们必须转到 配置属性 -> 链接器 -> 常规 并添加库位置。我们将使用 MDI 库,它有两种版本:一种用于调试,一种用于发布。这些库并未在 zip 文件中“构建”,因此您必须打开 .sln 文件并创建它们(如果您还没有)。(一些示例项目将库作为解决方案中的一个项目,并在编译期间自动构建它们。)

一旦它们被构建,回到这个项目。我们正在 配置属性 -> 链接器 -> 常规 页面,并在左上角将下拉菜单更改为“调试”。将“D:\Programs\LibsAndUtils\DWinLibLibrary\MDI_Unicode\Debug”添加到“其他库目录”。按“应用”,然后更改为“发布”并将其添加到“D:\Programs\LibsAndUtils\DWinLibLibrary\MDI_Unicode\Release”。再次按“应用”,然后切换回配置下拉菜单中的“所有配置”。

您还必须将库的名称添加到 配置属性 -> 链接器 -> 输入 -> 其他依赖项 行。该库是“DWL_MDI_Unicode.lib”。发布和调试版本名称相同,因此您不必处理独立的设置。

此时,您可以像之前一样尝试执行程序,并逐个修复遇到的错误。或者,您也可以直接按照之前的说明进行操作,并进行相同的更改。它们是:

  • 配置属性 -> C/C++ -> 预编译头 更改为“使用”,将预编译头文件更改为“PrecompiledHeaders.h”,并将“PrecompiledHeaders.cpp”文件设置为编译的文件,方法是关闭配置框,然后通过在解决方案资源管理器中右键单击该文件来打开该文件本身的配置框。
  • 回到项目配置页面,而不是 PrecompiledHeader.cpp 文件配置。在 配置属性 -> C/C++ -> 常规 -> 其他包含目录 中添加必要的项。DWinLib 的项保持不变,但程序路径会更改,如下所示:
    • D:\Programs\LibsAndUtils\DWinLib
    • D:\Programs\MyProgs\DwlPwcStudio
  • 配置属性 -> C/C++ -> 语言 -> 一致性模式 更改为“”。
  • 配置属性 -> 链接器 -> 子系统 需要更改为 Windows。
  • 将“DWL_MDI_APP”添加到 配置属性 -> C/C++ -> 预处理器

    此时,Visual Studio 并不很智能。我们需要切换到“调试”并从预处理器定义中删除“_CONSOLE;”,我们还需要为“发布”选项重复此操作。

恭喜!此时程序可以执行了,但有一个问题。如果您将输出与示例程序进行比较,会发现其中没有任何对接器可见!只有一个奇怪的屏幕伪影。

原因在于 DWinLib 使用宏定义来编译对接器的添加。所以,将“DWL_USE_DOCKERS”添加到所有配置的 配置属性 -> C/C++ -> 预处理器 -> 预处理器定义 中。重新编译后一切正常!

我希望这个概述能帮助新手掌握在 Visual Studio 中使用项目和解决方案的基础知识。我也希望它对任何玩过 DWinLib 的人都有用。

和之前一样,这里有一个完成的项目 zip 文件,由于它是在同一个子目录中制作的,所以无法直接与上面进行比较

祝您编码愉快!

历史

  • 2021 年 1 月 16 日 - 重写了关于 DWinLib 6.04 的文章,并删除了所有之前的历史记录,因为它们在此上下文中没有价值。而且,也没有未来的历史记录!只是我更多的积极主动!
© . All rights reserved.