Delphi 项目编译错误:包“A”和“B”都包含单元“C”

Delphi project compilation error: Packages 'A' and 'B' both contain unit 'C'

提问人:Zarik 提问时间:2/24/2023 最后编辑:Remy LebeauZarik 更新时间:2/24/2023 访问量:135

问:

我有一个 Delphi 项目组,由三个项目组成:、 和 。SalesInventoryOrders

在 Sales 项目中,有一个名为 的单元。项目有一个名为“单元”的单元,用于从项目导入。该项目在文件的子句中同时列出了 和 ,并且还导入到 .Customers.pasInventoryProducts.pasCustomersSalesOrdersSalesInventoryrequiresOrders.dpkCustomersOrdersUnit

但是,当我尝试编译项目时,出现以下错误:

[dcc32 错误]Orders.dpk(42): E2199 包“Sales”和“Inventory”都包含单位“Customers”

是什么原因导致了这个错误,可能的解决方案是什么?我无法移动、删除或重命名代码库中的任何文件。

delphi compiler-errors 软件包 命名空间 delphi-10.2-tokyo

评论


答:

3赞 Remy Lebeau 2/24/2023 #1

从错误中可以清楚地看出,尽管您声称“库存项目......从 Sales 项目中导入 Customers”。Customers

因此,当 Orders 项目在两个包中链接时,它最终会得到 2 个单独的单元副本,这是不允许的。Customers

该单元只能在单个软件包中实现。想要在运行时在同一进程中使用该单元的任何其他项目都必须从该包导入该单元。Customers

您的库存项目显然未正确导入单位。例如,如果从 Sales 项目编译的单元在 Inventory 项目的搜索路径上可见,则编译器将在编译 Inventory 项目时使用该 DCU,而不是从 Sales 包导入单元。确保情况并非如此。CustomersCustomers.dcu

评论

0赞 Zarik 2/24/2023
老实说,我已经将场景简化为这 3 个项目。实际的项目组是一个 20 多年前产品的遗留代码库,项目组内还有其他几个项目,它们的需求列表中有清单。我 100% 确定 Inventory 项目中没有 Customers 单元,唯一包含 Customers.pas 的项目是 Sales。
0赞 Remy Lebeau 2/25/2023
@Zarik“库存项目中没有客户单位”,在您的问题中,您说:“库存项目有一个名为 Products.pas 的单位,用于从 Sales 项目导入客户”。显然,导入无法正常工作。编译器正在从其他位置拉入 Customers 单元。仅仅因为 Sales 不包含 PAS 文件并不意味着它不能使用 DCU 文件。尝试使用 SysInternals 进程监视器来查看编译器在编译时实际接触的文件。