项目迁移后未解决的外部问题

Unresolved External After Project Migration

提问人:Bob Penoyer 提问时间:11/7/2020 最后编辑:0xdwBob Penoyer 更新时间:11/9/2020 访问量:455

问:

我正在使用 C++ Builder 10.4.1。我迁移了一个包含 3 个表单的简单项目。主窗体包含一个 .当我尝试编译时,出现以下错误:TDriveComboBox

[ilink32 Error] Error: Unresolved external 'Vcl::Filectrl::TDriveComboBox::' referenced from (then it lists the path to the main form's OBJ file)
[ilink32 Error] Error: Unresolved external '__fastcall Vcl::Filectrl::TDriveComboBox::GetDrive()' referenced from (then it lists the path to the main form's OBJ file)

我什至尝试删除并替换它,但这无济于事。 问题是什么,我该如何解决?TDriveComboBox

C++Builder VCL 未解析外部

评论

0赞 Ken White 11/7/2020
链接器的库列表中缺少包含该控件的任何库。删除控件并重新添加它无济于事;在生成应用之前,链接器仍需要找到用于解析符号的库。
0赞 Spektre 11/8/2020
@KenWhite不,他没有错过任何东西......这是一个罕见但已知的问题,IDE破坏了项目文件
0赞 Remy Lebeau 11/10/2020
让较新的 IDE 迁移较旧的项目很少是一个好主意。太多的事情可能会出错,参考资料可能会被搞砸,等等。通常,最好在新 IDE 中创建一个新项目,然后根据需要将现有源文件添加到该项目中。
0赞 Bob Penoyer 11/10/2020
雷米,我确实对这个项目进行了真正的迁移。

答:

2赞 Spektre 11/7/2020 #1

我会:

  1. 删除所有临时文件(obj,exe,TDS,...)
  2. 在有此问题的表单上添加新的临时工TDriveComboBox
  3. 编译并运行。

如果这没有帮助,那么有时手动将组件包含在表单文件中的 VCL 标头有助于重置编译器/链接器,因此请在 VCL inc 文件夹中搜索 In mine system its in here:#include*.hTDriveComboBox

c:\Program Files (x86)\Borland\BDS\4.0\include\vcl\FileCtrl.hpp

因此,添加如下内容:

#include <FileCtrl.hpp>

#include <vcl\\FileCtrl.hpp>

添加到您的表单文件中...但即使这样有时也会失败。根据我的经验,问题出在项目文件(或较新版本获得的任何扩展名)中,因此最好在编译器正常工作时备份它......因为它有时会自我破坏,尤其是对于大型项目。*.h*.bds, *.bdsproj, ...

有时,如果您移动,也会有所帮助:

#pragma hdrstop

行到不同的位置(几行向下或向上)。如果幸运的话,它还可以重置编译器/链接器,之后您可以将其移动到原始位置。然而,这只是偶尔有帮助(如1:20)。而且您还需要尝试几个位置

如果没有任何效果,只需创建新的空项目并将表单和内容复制到其中并将其添加到项目中......每个表单都有 3 个文件 (),如果应用程序使用的所有第三方自定义内容没有直接链接,请不要忘记将您需要的任何内容 (DLL *.lib,...) 添加到您的项目中*.h,*.cpp,*.dfm#pragma link

曾经(也是在从 BCB5 迁移到 BDS2006 之后),即使这对我的一个项目也没有帮助。我被迫创建表单(包含所有组件但没有功能,只需将它们放在表单上),然后从旧应用程序中复制内容......但是,如果您拥有太多组件,那将是一件痛苦的事情......

评论

2赞 Bob Penoyer 11/8/2020
谢谢。TDriveComboBox 位于 C++ Builder 10.4.1 的 Vcl.FileCtrl.hpp 中。将 #include 放在 .h 文件的编译器控制部分或靠近 .cpp 文件的顶部即可。我使用的格式是 #include < Vcl.FileCtrl.hpp>。我不喜欢篡改 .h 文件的编译器控制部分,所以我把它放在 .cpp 文件中。这奏效了。有趣的是,将另一个 TDriveComboBox 添加到窗体中并不会导致将 #include 行添加到 .h 文件中。
0赞 Spektre 11/8/2020
@BobPenoyer VCL 标头结构是由 IDE 生成的,有时它会自行损坏......手动将标头添加到正确的位置将进行补救(但不能修复),但是项目文件有时会自行重置,但是一旦发生这样的事情,它就会以同样的方式一遍又一遍地损坏自己......根据我的经验,您获得的 VCL 组件(类型和数量)越多,出现此问题的可能性就越高......我只在我的 3 个项目中遇到过这个问题(在超过 15 年的 BCB 编码中),所以幸运的是这个错误很少见......
0赞 Spektre 11/8/2020
另外,如果这解决了您的问题,您应该将其检查为可接受的答案。有趣的是,在您的编译器上,它需要在 *.cpp ...我使用的是旧版本 (BDS2006),并且仅放置在 *.h 中有效,因此 IDE/编译器版本之间的行为可能会发生一些重大变化
1赞 Fan Yang 9/13/2022
Adding #include <Vcl.FileCtrl.hpp> in the cpp file works for me migrating from BCB 6 to RAD Studio 11.2. Thanks.
0赞 tom l 11/9/2020 #2

I have found for most of these problems created by the ide in converting my 10.3.3 projects to 10.4.1 can be solved by an annoying process as described below:

  1. open the form.
  2. on design tab, switch to text view.
  3. switch to form veiw.
  4. under project, recompile just the form.
  5. now run project.

This has solved most of my unresolved's except _CG_*.