我们正试图将我的单片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的一个副本:它肯定会链接到正确的。
使用Depends
和TDump
检查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。目前没有修复,但警告似乎并不表示存在真正的问题(即,它可能可能是一个虚假的错误,而在运行时必须点击对话框是很遗憾的,希望如此在错误中没有什么可担心的。)
答案 0 :(得分:1)
由于其中一个来自.bpl,您是否尝试在项目选项中关闭“使用运行时包构建”?
答案 1 :(得分:1)
我们遇到了类似的问题。我们将其跟踪到没有“多线程”选项创建的(非VCL).cbproj。
据我所知,唯一一次有机会设置此选项是在创建新的.cbproj时,之后使用GUI无法更改。我们最终“黑客攻击”.cbproj包含以下内容:
<Multithreaded>true</Multithreaded>
要确定导致问题的dll,它应该是您在看到CG消息之前在输出窗口中加载的最后一个dll。
答案 2 :(得分:1)
答案 3 :(得分:1)
客户在我们的公开bug tracking system中记录了类似的案例,并且已在最新版本中识别并修复了该错误。