War*_* P 12 delphi dependencies bpl
我的一般问题是你如何排除故障"我的BPL不会因为依赖而无法加载,无论我清理和重新编译多少". 更新你可能认为你有一个干净的重新编译系统,但由于Windows的反奇迹及其文件系统虚拟化错误功能,你还没有.
当我尝试将我的设计时包(在本例中命名dclFsTee.bpl)加载到我的Delphi IDE中时(它是快速报告4 teechart包装器组件包),它抱怨:
The program can't start because tee7100.bpl is missing from your computer. Try reinstalling ...
Run Code Online (Sandbox Code Playgroud)
这tee7100.bpl是不是在我的系统上的任何DCP或DCU文件,我知道引用.但显然,有些事情是错的,我找不到问题.
所有Delphi用户都面临着一百个"不会编译或不会加载"BPL问题.当被问及做什么时,通用副词是清理您的计算机.
但是,我现在花了几个小时来清理我的计算机,虽然一切都编译了文件,但显然必须有某些东西过时隐藏,因为我试图加载的结果BPL文件仍然想加载一个版本的几天前我从这个系统中删除的TeeChart BPL,以及我能找到的每一条痕迹.
我删除的Delphi 2007中的TeeChart内容包括$(BDS)\ Lib和$(BDS)\ Lib\debug文件夹中的所有内容,以及系统上的所有DCP和BPL文件夹.此外,每个名为TeeChart-unit的dcu文件都已消失.
一旦你走到了尽头,你接下来会尝试什么?(格式化硬盘,购买新电脑.)说真的.我认为我是一个聪明的人,但我有一个1 Tb的硬盘驱动器,一个运行到80多个文件夹的库路径,以及一个似乎组织良好的源代码存储库,但显然有些东西隐藏在我不能的地方找到它.
我有完整源代码的TeeChart Standard 2012,据我所知,我的开发机器不再包含delphi附带的"tee chart tee7100.bpl"版本的旧TeeChart BPL或DCP文件.
我已经运行了teechart附带的"recompile.exe"向导,在向tee.inc文件写入{$ DEFINE x}声明后,它似乎只运行MSBuild并构建包(源代码中有两个)分配).
但是,不知何故,似乎默认情况下,其中一个隐式导入到其中一个软件包中的是一些尚未重建的过时文件,因此会尝试加载tee7100.bpl.新的bpl名称是tee911.bpl.
而不是问一些非常具体的快速报告问题,我只是提到它是一个特定的伤害世界的例子,我在Delphi开发时遇到了几十次.
我只给出了快速报告的详细信息,这样你就可以看到这实际上是一个普通问题的特定实例,当处理组件源代码或包或带有依赖关系的包时,有时会在Delphi IDE中面临这个问题. .清理您的计算机,以便您的代码甚至构建可能是棘手的.
所以这是我的Delphi包到包依赖解析问题:
找到或跟踪隐藏加载一些不再需要的BPL问题的最有效方法是什么,这样我的代码(构建和编译就好了!)实际上会加载到Delphi IDE中.运行重新编译产生的BPL文件似乎正确链接到正确的DCP文件,并且不存在旧的/陈旧的DCP或DCU文件.例如,新的DCP文件名是tee911.dcp.
你能以某种方式得到任何关于什么包实际上是陈旧的,以及在.bpl链接时正在读取和链接以及静态导入的内容吗?(我想可能像BPL文件的特殊MAP类文件?)
更新经过几个小时的战斗,并使用我所知道的每一个技巧,我意识到我没有检查VirtualStore过Windows 7中文件虚拟化引起的一些相关问题.这意味着Windows 7依赖于运行在它上面的程序.它为您提供了该文件的另一个版本,而不是您想要的版本.这在几个方面可能是致命的; 一; 你重新编译了一个BPL,但那不是加载的.杀死我的BPL位于SysWow64文件夹中,该文件夹是VirtualStore的一部分.请注意,虚拟存储基本上会出现幻像文件,只有当你是一个特定的"低级别"程序时才会出现,其中Delphi 2007在Win7/64位上显然是这样.要删除当前用户帐户的SysWow64 VIRTUALSTORE文件夹中的BPL文件,请执行以下操作:
del %HOMEPATH%\AppData\Local\VirtualStore\Windows\SysWow64\*.bpl
Run Code Online (Sandbox Code Playgroud)
...有些日子我只讨厌Windows架构.无论如何,我不打算将上述内容作为答案,因为我想知道是否有人有更好的方法或任何可能有助于下次的提示或建议.
War*_* P 11
好的,没有其他人回答,所以我会把它放在这里对未来的人们有所帮助:
- 在清理破坏的系统时记住Windows VirtualStore,这些系统上有旧版本的DLL,包括TeeChart,FastReport,Indy等,这些系统往往涉及混乱,因为它们可以作为"装有delphi的外包装"存在如果您直接从供应商处购买和安装它们,或者经常安装为升级版本,或者您可以在公司的mega-component-pack目录中拥有自己的编译副本.
- 当搜索重复或过时的BPL时,在Windows中进行文件搜索不会查看虚拟商店,您必须手动查找并删除整个虚拟存储区域,以供您的进程或用户或程序使用.
这个问题的第二个层面是:
FastReports的依赖关系图很复杂:
这取决于Indy,你可能拥有自己的Indy版本,而Delphi本身就有一个,而你硬盘上的其他东西可能都有自己的Indy副本.
它支持各种版本的TeeChart,包括Delphi附带的二进制文件,以及您可能从Steema购买的标准版或其他购买的TeeChart版本.
它使用预编译的头文件包含文件进行编译,而不仅仅是一个名称相同的include(.inc)文件的一个而是两个不同的副本.
当您使用自己的编译器工具(重新编译FastReport)时,它的工作非常可靠,但是当您想要从单个构建脚本构建项目中的所有内容时,这不是最好的,因此是我的问题的根源.
关键是要学习所有关于你的巨大包装中所有组件的依赖关系的知识,并干净地组织你的系统,这样你就不会有旧东西(比如Indy和TeeChart bpls,dcp或dcu)文件)躺在身边.如果你不知道自己在做什么,那么清理它是一项非常复杂的工作.
用于真正删除系统附带的Indy和TeeChart版本的所有痕迹的实用程序,以及FastReports的"Embarcadero版本"是解决此问题的关键.一般提示是"如果X版本与Delphi一起发布,并且您要安装新版本,请准备好直到您的系统真正清理完毕".
避免所有这些废话的一个非常神奇的技术是在最初的Delphi IDE安装过程中不安装Indy,FastReport或TeeChart(取消选中或跳过它们),然后从源代码中逐个安装它们.仅仅因为在Delphi中预安装了一个版本并不是一件好事.(更新:你不能再在安装过程中取消选择Indy,它至少是Delphi XE8的基础Delphi产品的一部分.从Delphi自己的lib目录中删除内置Indy的清理实用程序对任何自己构建的人都是必要的. .)
另一个非常神奇的技术是在虚拟机上运行商业组件的安装程序,然后收集pascal源代码并将其传输到您的清洁开发机器上,并自行构建.这样你就可以避免在你的系统周围散布BPL和东西时发生的可怕事情,甚至安装到C:\Windows\System32(在32位系统上)和C:\Windows\SysWow64(在64位系统上的等效路径).
| 归档时间: |
|
| 查看次数: |
26694 次 |
| 最近记录: |