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

t30tvxxf  于 2023-01-05  发布在  其他
关注(0)|答案(3)|浏览(213)

在 Delphi 中,我可以通过将文件夹的源代码添加到项目搜索路径或库路径来包含该文件夹的源代码。搜索路径仅适用于当前项目,而库路径适用于使用IDE打开的任何项目。
除此之外,“搜索”路径和“库”路径之间是否存在功能差异?
我问的原因是:我有一个文件夹X,其中包含项目A使用的源代码。当我将该文件夹包含在项目A的搜索路径下时,它说无法在该文件夹中找到特定文件。当我将其包含在库路径下时,项目A编译良好。
直到现在,我一直有这样的印象,唯一的区别是一个是特定于项目的,而另一个是全球性的。
当我们谈到这个主题时(冒着出丑的风险):“库路径”和“浏览路径”在功能上有什么区别?

jfgube3f

jfgube3f1#

据我所知,浏览路径是调试器在中断/单步执行不在库路径中的源文件时应该查找文件的地方。
假设你有一个第三方的组件,你把库路径指向那个组件的预编译的dcu-files所在的目录,你的项目在编译的时候会用到这些dcu-files,这很好,因为它不会在你每次编译的时候都被重新编译。
但是包含编译的dcu文件,就失去了调试第三方组件的可能性。如果在浏览路径中包含源文件所在的路径,调试器将找到源文件,并允许您单步调试它。
vcl的默认设置显示了这一点,在库路径中他们放置了$(BSD)\Lib,在浏览路径中他们放置了$(BDS)\SOURCE\WIN32...
更新:有两种不同的搜索路径:编译器搜索路径和调试器搜索路径。第一个是编译器在编译期间查找文件的位置,第二个是调试器在调试期间查找源文件的位置。
编译器将仅在库路径或项目搜索路径中查找文件。调试器将在编译器搜索路径加上浏览路径、项目的调试源路径和全局调试搜索路径中查找标识符。
在全球范围内或公共关系项目中指定事情不应该有任何区别。

cotxawn7

cotxawn72#

“库路径”字段

这是编译器在编译我们的项目时查找所需文件的路径。
我们将在这里找到三种主要类别的路径:
1.在第一行,我们可以看到列出了 Delphi 自己的预编译DCU。我们将很快讨论预编译DCU。

这些路径是由 Delphi 的安装程序添加到这里的。不要碰它们,否则你会搞砸整个Delphi,你将不得不重新安装-除非你有相应注册表项的备份,这是:关键字当前用户\软件\商场\BDS\21.0\图书馆
1.接下来,如果您使用自动安装程序安装了第三方软件包/库,您将在此处看到它们的路径。通常,只有包含DCU文件(而不是Pas文件)的文件夹才会在此处列出。以下是一些示例:

这些路径是由上述安装程序自动添加的。如果您想使用没有自动安装程序的第三方库(如LightSaber),您必须手动输入它们的路径,如下所述(第3点)。
1.最后,如果我们构建了自己的库,我们会希望在这里手动放置这个库的路径。

“浏览路径”字段

如果在IDE中按住Ctrl键并单击某个例程(如Application.ProcessMessages),IDE将显示ProcessMessages的源代码,该代码位于:
c:\Delphi\source\vcl\Vcl.Forms.pas
当“c:\ Delphi \source\vcl”文件夹不在库路径中时,IDE如何知道在哪里查找Vcl.Forms.pas?这是通过浏览路径完成的。如果我们查看“浏览路径”,我们会看到VCL文件夹已经在那里了:

如果IDE在项目的“搜索路径”中找不到标识符(函数、变量等),它将开始在“库路径”中搜索。如果该标识符也不存在,IDE将查看Browsing文件夹。
了解IDE(以及调试器,因此我们可以在调试时单步执行库的源代码)可以访问“浏览路径”中列出的文件夹,但编译器无法访问这些文件夹,这一点非常重要。

因此,在“Browsing Path”中,我们添加了一些文件夹,其中包含我们希望能够在IDE中使用Ctrl+Click查看/浏览的单元,但我们不希望被编译器找到。
我认为Embarcadero团队在这里搞砸了一点。他们应该使用“编译器路径”而不是“库路径”,使用“IDE路径”而不是“浏览路径”。

“调试DCU路径”字段

文档中说,“指定用于调试的Delphi编译单元的路径”,这意味着它包含了Delphi调试DCU所在的文件夹(参见“预编译DCU”一节),我们不应该触及这个。
通常,我们只在此处列出一个文件夹:

“调试源路径”字段

“调试源路径”是一个不太明显的地方,我们可以在这里输入路径。在这里我们输入Pas文件的路径,我们对这些文件进行了预编译,以加快项目的总体编译速度。请注意,这位于“Embarcadero调试器”页面下,而不是“库”页面下:

“使用调试DCU”字段

Delphi 的单元有两种“风格”:调试和发布风格。因此,人们可能倾向于认为,当我们在调试模式下编译应用程序时,编译器将隐式使用RTL/VCL框架的调试DCU。事实并非如此。编译器将使用代码的调试DCU,但不使用RTL/VCL库的调试DCU。
我们可以很容易地验证这一点:我们只是在调试模式下构建应用程序,并在源代码中的某个地方放置断点。我们稍后将谈到断点和调试。我们将看到,当我们按下F7键时,我们可以单步执行例程。但如果我们尝试单步执行 Delphi 例程(比如说应用程序、进程消息),调试器不会进入该例程,因为 Delphi 编译了Vcl.Forms.pas(ProcessMessages所在的单元)的“发布”版本,即使我们的应用是在“调试”模式下编译的。
要强制编译器链接其VCL/RTL库的“调试”版本,我们需要激活“项目选项”中的“使用调试DCU”复选框。注意!我说的是“项目选项”,而不是 Delphi 的“全局选项”:

何时激活“使用调试DCU”?

如果“使用调试DCU”选项没有激活,并且我们调试我们的应用程序,我们只能单步调试我们自己的代码。这是我们在大多数情况下想要的,因为是我们的代码有缺陷,而不是 Delphi 的代码。不断地单步调试Delphi的代码是相当烦人的。
我们激活“使用调试DCU”:·如果我们想了解 Delphi 内部是如何工作的--例如,当我们想在ProcessMessages中放置一个断点,以查看它何时执行。·如果我们认为我们在RTL/VCL中发现了一个bug
注意:激活此选项后,我们需要重新构建我们的项目!

ewm0tg9j

ewm0tg9j3#

调试器还将在库路径中查找文件。

相关问题