Delphi搜索路径与库路径与浏览路径

Jos*_*ons 31 delphi

在Delphi中,我可以通过将文件夹的源代码添加到项目搜索路径中,或者将其添加到库路径中来包含该文件夹的源代码.搜索路径仅适用于当前项目,而库路径适用于使用IDE打开的任何项目.

除此之外,搜索和库路径之间是否存在任何功能差异?

我问的原因是:我有一个文件夹X,项目A使用了源代码.当我在项目A的搜索路径下包含该文件夹时,它说它找不到该文件夹​​中的特定文件.当我将它包含在库路径下时,项目A编译得很好.

到目前为止,我总是认为唯一的区别是一个是项目特定的,另一个是全球的.

当我们谈论这个话题时(并且冒着自欺欺人的风险):"库路径"和"浏览路径"之间的功能区别是什么?

Veg*_*gar 30

据我所知,浏览路径是调试器在打破/插入不在库路径中的源文件时应查找文件的位置.

假设您使用了第三方组件.您将库路径指向该组件的预编译dcu文件所在的目录.编译时,您的项目将使用这些dcu文件.这很好,因为每次进行构建时都不会重新编译.

但是通过包含已编译的dcu文件,您无法调试thirparty组件.如果包含源文件在浏览路径中的路径,则调试器将找到源,并允许您单步执行.

vcl的默认设置显示了这一点.在库路径中,他们放了$(BSD)\ Lib,并且在浏览路径中他们放了$(BDS)\ SOURCE\WIN32 ......

更新:有两种不同类型的搜索路径:编译器搜索路径和调试器搜索路径.第一个是编译器在编译期间查找文件,第二个是调试器在调试期间查找源文件的位置.

编译器只能在库路径或项目搜索路径中查找文件.调试器将在编译器搜索路径中找到标识符,加上浏览路径,项目的调试源路径以及全局调试搜索路径.

在全局或pr项目中指定事物应该没有任何区别.


WeG*_*ars 6

摘自我的Delphi 书

\n

\xe2\x80\x9c 库路径\xe2\x80\x9d 字段

\n

这是编译器在编译我们的项目时查找所需文件的路径。

\n

我们在这里可以找到三类主要的路径:

\n
    \n
  1. 在第一行我们可以看到列出了Delphi\xe2\x80\x99s自己的预编译DCU。我们很快就会讨论预编译的 DCU。
  2. \n
\n

在此输入图像描述

\n

这些路径由 Delphi\xe2\x80\x99s 安装程序添加到此处。不要\xe2\x80\x99触摸它们,否则你会搞砸整个Delphi,你将不得不重新安装 - 除非你有适当的注册表项的备份,即:KEY_CURRENT_USER\\SOFTWARE\\Embarcadero\\BDS\\ 21.0\\图书馆\\

\n
    \n
  1. 接下来,如果您使用自动安装程序安装了第 3 方软件包/库,您将在此处看到它们的路径。通常,此处仅列出包含 DCU 文件(而不是 Pas 文件)的文件夹。这里有些例子:
  2. \n
\n

在此输入图像描述

\n

这些路径由上述安装程序自动添加。\n如果您想使用没有自动安装程序的 3rd 方库(例如 LightSaber),则必须按照说明手动输入其路径如下(第 3 点)。

\n
    \n
  1. 最后,如果我们构建自己的库,我们需要手动将这个库的路径放在这里。
  2. \n
\n
\n

\xe2\x80\x9c浏览路径\xe2\x80\x9d字段

\n

如果我们在 IDE 中按住 Ctrl 键并单击例程(如 Application.ProcessMessages),IDE 将带我们到 ProcessMessages 的源代码,该代码位于:

\n
\n

c:\\Delphi\\source\\vcl\\Vcl.Forms.pas

\n
\n

当 \xe2\x80\x9cc:\\Delphi\\source\\vcl\xe2\x80\x9d 文件夹不在库路径中时,IDE 如何知道在哪里查找 Vcl.Forms.pas?\n这是通过以下方式完成的浏览路径。如果我们查看 \xe2\x80\x9cBrowsing Path\xe2\x80\x9d,我们会看到 VCL 文件夹已经存在:

\n

浏览路径

\n

当IDE在project\xe2\x80\x99s \xe2\x80\x9c搜索路径\xe2\x80\x9d中找不到标识符(函数、变量等)时,它开始在\xe2\x80\x9c库路径\xe2\中搜索x80\x9d。如果标识符也不存在,IDE 会查找浏览文件夹。

\n

重要的是要了解 \xe2\x80\x9cBrowsing Path\xe2\x80\x9d 中列出的文件夹可供 IDE 访问(也可供调试器访问,因此我们可以在调试时单步进入库的源代码)但不是编译器。

\n

在此输入图像描述

\n

因此,在 \xe2\x80\x9cBrowsing Path\xe2\x80\x9d 中,我们添加了保存我们希望能够在 IDE 中使用 Ctrl+Click 来查看/浏览的单元的文件夹,但我们不添加 \xe2\x80\x99t想要被编译器找到。

\n

我认为内河码头团队在这里搞砸了一点。他们应该使用\xe2\x80\x9c编译器路径\xe2\x80\x9d而不是\xe2\x80\x9c库路径\xe2\x80\x9d和\xe2\x80\x9cIDE路径\xe2\x80\x9d而不是\xe2 \x80\x9c浏览路径\xe2\x80\x9d。

\n
\n

\xe2\x80\x9cDebug DCU 路径\xe2\x80\x9d 字段

\n

文档说,\xe2\x80\x9c指定用于调试的Delphi编译单元的路径\xe2\x80\x9d。这意味着它包含 Delphi\xe2\x80\x99s 调试 DCU 所在的文件夹(请参阅 \xe2\x80\x9cPrecompiled DCUs\xe2\x80\x9d 部分)。我们不应该碰这个。

\n

通常,我们只会在此处列出一个文件夹:

\n

在此输入图像描述

\n
\n

\xe2\x80\x9cDebug 源路径\xe2\x80\x9d 字段

\n

\xe2\x80\x9c调试源路径\xe2\x80\x9d是一个不太明显的地方,我们可以在其中输入路径。在这里,我们输入预编译的 Pas 文件的路径,以加快项目的总体编译速度。请注意,它位于 \xe2\x80\x9cEmbarcadero debuggers\xe2\x80\x9d 页面下,而不是在 \xe2\x80\x9cLibrary\xe2\x80\x9d 页面下:

\n
\n

\xe2\x80\x9cUse debug DCUs\xe2\x80\x9d 字段

\n

Delphi\xe2\x80\x99s 单元预编译为两个 \xe2\x80\x9cflavors\xe2\x80\x9d:调试版本和发布版本。\n因此,人们可能会倾向于认为,当我们在“调试”中编译应用程序时模式下,编译器将隐式使用 RTL/VCL 框架的调试 DCU。它没有\xe2\x80\x99t。编译器将为我们的代码使用调试 DCU,但不会为 RTL/VCL 库使用调试 DCU。

\n

我们可以轻松测试这一点:我们只需在调试模式下构建应用程序并在其源代码中的某个位置放置一个断点。我们很快就会讨论断点和调试。当我们按下 F7 键时,我们将看到我们可以进入我们的例程。但是,如果我们尝试进入 Delphi 例程(让 \xe2\x80\x99s 说 Application.ProcessMessages),我们就可以\xe2\x80\x99t。调试器不会进入该例程,因为 Delphi 编译了 Vcl.Forms.pas(ProcessMessages 所在的单元)的 \xe2\x80\x9crelease\xe2\x80\x9d 版本,即使我们的应用程序是在\xe2\x80\x9c调试\xe2\x80\x9d 模式。

\n

要强制编译器链接其 VCL/RTL 库的 \xe2\x80\x9cdebug\xe2\x80\x9d 版本,我们需要激活 \xe2\x80\x9cUse Debug DCUs\xe2\x80\x9d 复选框xe2\x80\x9c项目选项\xe2\x80\x9d。这里要小心!我说的是\xe2\x80\x9c项目选项\xe2\x80\x9d,而不是Delphi\xe2\x80\x99s\xe2\x80\x9c全局选项\xe2\x80\x9d:

\n

项目选项delphi

\n

何时激活\xe2\x80\x9cUse debug DCUs\xe2\x80\x9d?

\n

如果 \xe2\x80\x9cUse Debug DCUs\xe2\x80\x9d 选项未激活,并且我们调试应用程序,则只能单步执行我们自己的代码。这是我们在大多数情况下想要的,因为有 bug 的是我们的代码,而不是 Delphi\xe2\x80\x99s 代码。继续单步执行 Delphi\xe2\x80\x99s 代码会很烦人。

\n

我们激活 \xe2\x80\x9cUse Debug DCUs\xe2\x80\x9d:\n\xe2\x80\xa2 如果我们想看看 Delphi 内部是如何工作的 \xe2\x80\x93 例如,当我们想要休息时指向 ProcessMessages 内部以查看它何时执行。\n\xe2\x80\xa2 如果我们认为我们在 RTL/VCL 中发现了错误

\n

注意:激活此选项后,我们需要重新构建我们的项目!对于某些更改来说,编译就足够了,但对于其他更改来说,编译是不够的。我还没有花时间列出哪些需要编译,哪些需要构建。因此,作为任何懒惰的人,我总是在更改项目选项后构建。

\n

在此输入图像描述

\n