在C ++ Builder 2010中使用包时,如何解决“加载两个不同的CRTLDLL”?

时间:2010-06-17 08:34:45

标签: delphi package c++builder codeguard

我们正试图将我的单片EXE拆分为EXE和几个包的组合。到目前为止,我们有一个我们正在尝试使用的软件包,并且在运行EXE Codeguard时在启动时显示以下错误:

CG Error

Two different CRTLDLLs are loaded. CG might report false errors
(C:\Windows\system32\CC32100MT.DLL)
(D:\Projects\Foo\Bar.bpl)

OK   

我读这是因为正在加载两个不同的运行时库 - 一个是正确的(CC32100MT.dll),一个不正确,这是我们尝试使用的包。

继续运行程序会显示奇怪的错误,尤其是在类之间进行转换或将指针作为参数传递给跨越EXE / DLL边界的方法。 Codeguard本身并没有显示任何其他错误。 编辑:现在已经解决了,并且没有相关性。程序似乎运行正常,但Codeguard显示的警告仍然令人担忧。

我们如何解决这个问题?

更多细节

我们已经看过很多事情,因为我们(开发这个和我的开发人员)可以集体思考:

  • 每个项目都是使用运行时包构建的。 EXE主机在其包列表中列出了Bar。

  • 每个项目都设置为使用动态RTL进行编译。但是,改变这个并不能解决问题。

  • 包通过其BPI文件链接到EXE,但通过LIB链接也没有区别。

  • 使用相同的项目设置编译EXE和BPL,其中两种类型的项目都存在相同的选项。无论如何我们认为:)

  • 系统上只有BPL和BPI的一个副本:它肯定会链接到正确的。

  • 使用DependsTDump检查EXE和BPL,表明他们都在使用C:\Windows\system32\CC32100MT.DLL。他们应该都使用一个RTL。

  • 创建一个新项目(一个简单的VCL表单应用程序)并链接到BPL(通过其BPI)工作正常。添加所有文件和LIB的过程中,我们的EXE包含了更改它所需的代码,但我们无法弄清楚是什么。

    • LIB都对应于我们使用的DLL(平面C接口,通常看起来好像是用MSVC构建的),或者是带有大量相关文件的简单项目,编译到lib以便链接到EXE - 顺便说一下,这些大致相当于我们想要分割成BPL的程序区域。似乎没有可能影响RTL链接的LIB项目的项目选项,除非我们错过了它们。

    • 我通过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 as report 86335。目前没有修复,但警告似乎并不表示存在真正的问题(即,它可能可能是一个虚假的错误,而在运行时必须点击对话框是很遗憾的,希望如此在错误中没有什么可担心的。)

4 个答案:

答案 0 :(得分:1)

由于其中一个来自.bpl,您是否尝试在项目选项中关闭“使用运行时包构建”?

答案 1 :(得分:1)

我们遇到了类似的问题。我们将其跟踪到没有“多线程”选项创建的(非VCL).cbproj。

据我所知,唯一一次有机会设置此选项是在创建新的.cbproj时,之后使用GUI无法更改。我们最终“黑客攻击”.cbproj包含以下内容:

<Multithreaded>true</Multithreaded>

要确定导致问题的dll,它应该是您在看到CG消息之前在输出窗口中加载的最后一个dll。

答案 2 :(得分:1)

答案 3 :(得分:1)

客户在我们的公开bug tracking system中记录了类似的案例,并且已在最新版本中识别并修复了该错误。