我们正在尝试将我们的整体 EXE 拆分为一个 EXE 和几个包的组合。到目前为止,我们有一个我们正在尝试使用的包,并且在运行 EXE Codeguard 时在启动时显示以下错误:
重心错误 加载了两个不同的 CRTLDLL。CG 可能会报告错误的错误 (C:\Windows\system32\CC32100MT.DLL) (D:\Projects\Foo\Bar.bpl) 好的
我将其读取为两个不同的运行时库正在加载 - 一个是正确的(CC32100MT.dll),一个是不正确的,这是我们正在尝试使用的包。
继续运行程序会显示奇怪的错误,尤其是在类之间进行转换或将指向类的指针作为参数传递给跨越 EXE/DLL 边界的方法。Codeguard 本身根本不显示任何其他错误。 编辑:这现在已经解决,并且不相关。该程序似乎运行正常,但 Codeguard 显示的警告仍然令人担忧。
我们如何解决这个问题?
更多细节
我们已经研究了我们(开发人员和我)可以集体想到的尽可能多的事情:
每个项目都是使用运行时包构建的。EXE 主机在其包列表中列出了 Bar。
每个项目都设置为使用动态 RTL 进行编译。但是,改变这一点并不能解决问题。
该包通过其 BPI 文件链接到 EXE,但通过 LIB 链接也没有区别。
EXE 和 BPL 使用相同的项目设置进行编译,其中两种类型的项目存在相同的选项。无论如何,我们认为:)
系统上只有一份 BPL 和 BPI 副本:它肯定链接到正确的副本。
检查 EXE 和 BPL
Depends
并TDump
显示它们都在使用C:\Windows\system32\CC32100MT.DLL
. 他们都应该使用一个 RTL。创建一个新项目(一个普通的 VCL 表单应用程序)并链接到 BPL(通过它的 BPI)工作正常。在添加所有文件和 LIB 的过程中,使我们的 EXE 包含更改它所需的代码,但我们无法弄清楚是什么。
LIB 要么对应于我们使用的 DLL(平面 C 接口,通常看起来好像它们是用 MSVC 构建的),要么是具有大量相关文件的简单项目,为了链接到 EXE 而编译到 lib - 这些大致对应顺便说一下,到我们想要拆分为 BPL 的程序区域。LIB 项目似乎没有会影响 RTL 链接的项目选项,除非我们错过了它们。
我已经详尽地
Depends
搜索并查看了 EXE 和每个 DLL 引用的所有 RTL 和 CC32*.dll 文件。全部相同:rtl140.bpl 和 CC32100MT.DLL。完全限定的路径也表明它们是相同的文件。一切都应该使用同一个运行时库。
编辑:最终的 EXE 很复杂,用几个库、几个 DLL 等构建。所有这些,当用 C++Builder 构建时,都是用当前版本构建的。这些 DLL 或 LIB 之一中是否有可能导致问题的东西?我对 RTL 的链接方式知之甚少,无法确定在哪里查看……我的(天真?)假设是链接器通常会链接到一组 RTL 函数中,但这当然不会似乎正在发生......而且我不知道使用包时事情会如何变化。是否有可能这个错误一直存在并且 Codeguard 之前没有标记它,因为我们没有使用像包这样的动态东西?
也许另一个问题是,为什么一个包会有它自己的 RTL,或者是什么让它算作 Codeguard 的“RTL DLL”?
我们很难过。绝对难倒。我们在使用 BPL 时遇到了其他问题(它们似乎是非常棘手的事情,尤其是使用 C++),但已经设法解决了所有问题。我们完全没有运气,我们非常感谢任何见解:)
我们使用的是 C++Builder 2010(实际上是 RAD Studio 的一部分,但除了组件之外几乎没有 Delphi 代码。)
编辑:开始赏金。我真的很想解决这个问题!
编辑 2:感谢David Dean的帮助(标记如下。)通过电子邮件,他指出这个问题是由其他人在一个简单的测试用例中复制的,并在Embarcadero QC 中作为报告 86335 登录。目前没有修复,但警告似乎并不表示真正的问题(即,它可能是一个虚假错误,虽然很遗憾在运行时必须点击对话框,但希望错误中没有什么可担心的关于。)