十多年来,我一直被困在Delphi 6上并且在逻辑(对我来说)单元结构中开发了数十万行代码,其中一个项目往往是几百行代码在我的“库”中引用高级工作例程。在尝试迁移到XE5时,我找不到将所有库单元编译在搜索路径上的一个位置,然后只是由项目使用(并在必要时重新编译),但是dcus关闭的方法使用库源而不是每个项目。
我刚开始接受“hello world”在XE5中需要2.5Mb,我不能理解每个库单元必须在项目级别单独编译成dcus。在“旧”时代,这些单元dcus将位于pas文件旁边,如果源文件中没有任何更改,则不会重新编译。
显而易见的地方是项目选项,但我找不到正确的设置让项目停止保存每个dcu的副本。
我隐约意识到多平台开发会导致重组,但我不禁感到有一些妥协的立场。
我必须要有一些重要的东西。
答案 0 :(得分:1)
从Delphi XE2开始,Delphi支持多平台的编译以及不同的构建配置。因此,Delphi需要为每个组合创建DCU文件。例如,Win32
,Win64
和OS-X
DCU文件默认保存在单独的文件夹中。否则,如果不是这样,DCU文件将相互覆盖,您应该避免(如果您使用不同的配置/平台)。
通过修改Delphi Compiler
,可以在第一部分Unit output directory
的项目选项中更改这些设置。这是默认情况下.\$(Platform)\$(Config)
,它为平台创建一个子文件夹,然后为配置创建另一个子文件夹,例如\Win32\Debug\
。小心最顶部的Target
,默认设置为当前的平台/配置。您通常希望先将其更改为All Configurations
。如果从选项中完全清除此字段,则会从旧版本中生成默认行为。
听起来你应该创建一个Package。这将允许您在一个地方(BPL)将所有“库”单元组合在一起。然后可以将此软件包安装到IDE中,如果您有任何组件,则可以将这些组件安装到组件托盘中。
或者你也可以不用包裹。所有这些不同项目的所有单元都应该移动到这个中心位置 - 一个包含所有“库”单元的文件夹。这样可以减少维护工作,只需将一个文件夹添加到全局库路径即可。
如果将文件放在中央文件夹中,并使用项目中的这些文件,项目和“库”的DCU文件将保存到该项目中。 Delphi不知道这些文件是一个“库”,它只知道你正在使用它们,并且因为它找不到这些单元的已编译版本,所以它会在你的项目中创建一个。如果您希望DCU文件只保存一次并位于此中心位置,那么您需要一个包。
答案 1 :(得分:0)
首先,我要感谢所有受访者提出这个问题 - 所有这些都提供了有用的见解。我尝试了各种建议(包括破坏XE5以至于我不得不重新安装 - 至少我学会了一些不要搞砸的地方。)
对我来说很重要,但是一个已知的错误编码实践,是让个别项目编辑共享库单元(只有我自己的单元 - 我不会乱用属于Delphi或第三方的代码)。这对于让多个应用程序处理相同的数据非常重要,但需要一口大小。共享代码让我可以将应用程序的高级部分提供给其他项目。可能有更好的方法(我很乐意听到它们),但这对我有用了很长时间。
多平台模型确实需要默认使用的dcu结构,所以我会适应它。共享源代码,但接受多个编译到单个项目。 JensG的一个很好的建议就是在项目没有积极开展工作时清理dcus。应该是直截了当的实用程序。
D6 - > XE5迁移(对于一些较少使用的区域需要几个月)需要我知道哪些单元成功编译,因此我将维护一个项目,其功能是包括所有单元并重新编译它们。这样可以将库单元pas文件映射到dcu文件。
AnsiString / AnsiChar< - >字符串/字符问题是主要的迁移问题区域。简单地进行编辑级更改可能会使代码通过编译器,但无法保证代码仍然以相同的方式工作。特别麻烦的是在Windows调用等接口点。我的答案是首先使单元可编译,然后编写故障区域的测试代码。这将需要几个月的时间 - 我需要继续使用新的东西,以及修复旧的东西。我真的不知道我是否能够在没有另一层测试的情况下将XE5兼容代码替换回Delphi 6。我认为它应该工作,但需要仔细检查。
第二个主要迁移问题是第三方代码,例如VCLZip。 XE5有自己的拉链支持,但我有很多地方使用VCLzip并且转换不会是微不足道的。对于这个特定的库,有可能找到XE5级别的源代码并简单地使用它。我从互联网上获得了其他代码片段,但从未真正了解哪些代码会导致重大麻烦。
再次 - 谢谢大家。这是一个有趣的24小时。霍华德