【问题标题】:Unsatisfied forward or external declaration, with new C++ obj-files不满意的前向或外部声明,带有新的 C++ obj 文件
【发布时间】:2013-08-06 08:22:31
【问题描述】:

我下载了一个免费的 Delphi 组件,用于处理 BZip2-archives: http://www.torry.net/vcl/compress/other/BZip21.05.zip (比较有经验的单元 AbBzip2.pas 组件缩写 http://sourceforge.net/projects/tpabbrevia/files/) - 它们非常相似。

组件运行良好。

问题:

  1. 我看到组件中的版本 *.obj 文件 BZip2 库 - 旧版本 - 2007 年 12 月 10 日的 1.0.5。决定将 obj 文件更新为新文件。

  2. 我去下载最新版本的BZip2 - 1.0.6 - http://www.bzip.org/downloads.html

  3. 将源 BZip2 存档解压到文件夹 c:\BZip2Src

  4. 运行“打开命令行VS2012 x86 Native Tools”(%comspec%/k""C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat""x86)

  5. 在控制台中,我转到 c:\BZip2Src (Cd /d c:\BZip2Src)

  6. 按照 makefile.msc (#usage: nmake.exe -f makefile.msc) 中的说明编译项目并获取新的 *.obj 文件。一路走来,得到一个工作程序bzip2.exe。

  7. 在 Delphi 的文件夹组件中复制新的 *.obj,而不是旧的 blocksort.obj、huffman..、compress..、decompress..、bzlib..。

  8. 运行 Delphi,尝试重新编译组件。

得到错误“[dcc32 Error] AbBzip2.pas (215): E2065 Unsatisfied forward or external declaration: 'BZ2_hbMakeCodeLengths'”等类似错误。

或者对于 bzip2.bas - [dcc32 Error] BZip2.pas(171): E2065 Unsatisfied forward or external declaration: '_BZ2_hbMakeCodeLengths'

...
{$L huffman.obj}
{$L compress.obj}
{$L decompress.obj}
{$L bzlib.obj}

{ $L crctable.obj}
{ $L randtable.obj}

{$IFDEF LFS}
uses
  Windows;
{$ENDIF}

procedure _BZ2_hbMakeCodeLengths; external; // **ERROR LINE** 
procedure _BZ2_blockSort; external;  // if i replace on "BZ2_blockSort" (without "_"), i get error "[dcc32 Error] BZip2.pas(710): E2065 Unsatisfied forward or external declaration: 'bz_internal_error'"
procedure _BZ2_hbCreateDecodeTables; external;
...

如果不对 C++ 命令行进行任何修改,我就不能指出所有选项编译器吗?

不适用于 C++,帮助正确编译 *.obj 文件。

【问题讨论】:

  • 简单的答案是您应该使用旧的 .obj 文件。试图让它与使用 cl 而不是 bcc32 编译的 .obj 文件一起工作,这会给你带来很多痛苦。即使您解决了参考文献,您也可能会遇到其他问题。你为什么要这样做?
  • 1.我想要一个有更正的新版本。 2. 我想学习如何用 C++ 制作和附加 obj。 3、前期工作(新版本zlib2没有太大区别)
  • 我编译了一个VS。 makefile、nmake.exe 或 cl.exe。现在我尝试了 BCC32 - 其他错误:[dcc32 Error] BZip2.pas (711): E2065 Unsatisfied forward or external declaration: '__streams' .. '_exit' ... '_fgetc' and ect
  • 好的,我得到旧版本 bzip2 (1.0.5) archive.ubuntu.com/ubuntu/pool/main/b/bzip2/…,但错误未修复:(
  • 阅读我的回答。最新的 Abbrevia 附带 1.0.6。而且你必须以正确的方式编译,正如 Abbrevia 的文档中所解释的那样。

标签: visual-studio delphi delphi-xe4


【解决方案1】:

Pascal 文件旨在与以非常特定的方式编译的 .obj 文件一起使用。您不能使用 bzip2 生成文件进行编译。您需要按照与Delphi库兼容的特定方式编译文件。

看看 Abbrevia。在sourceforge repo 我们有这个:

bzip2 SDK v1.0.6 可从 http://bzip.org/1.0.6/bzip2-1.0.6.tar.gz 获得原始下载 编译 32 位 bcc32 -q -c -u- -w-8004 -w-8008 -w-8057 -w-8066 -w-8068 -DBZ_NO_STDIO *.c 用 64 位编译 cl -c -nologo -GS- -Z7 -wd4068 -Gs32768 -DBZ_NO_STDIO *.c

因此,这告诉您 32 位 Abbrevia 旨在与 bcc32 编译目标文件一起使用(使用该特定命令行)。也许你也可以让它与cl 一起工作。当然,Craig 已经成功地为他的 64 位构建做到了这一点。

在您的问题中,您声明 Abbrevia 中使用的 bzip2 文件已过期,并且您希望使用 1.0.6。好吧,这种说法是不正确的。很明显,您的 Abbrevia 版本已过时。

您应该从 sourceforge 存储库中提取最新版本的 Abbrevia,它带有 bzip2 1.0.6 的 .obj 文件。正是您正在寻找的。如果您想对 bzip2 源代码文件进行一些修改,您可以这样做并使用上面的命令行重新编译它们。

【讨论】:

  • 是的,它有效,谢谢。另一个小问题:什么编译器选项可以从 obj 文件调试文本或任何垃圾中删除(如果打开任何 obj,我会看到更多文本路径链接“BSC:\Program Files (x86)\Embarcadero\RAD Studio\11.0\include\windows\ sdk\ime_cmodes.h ...")?用于更小的 obj 文件。
  • 该信息的存在是有原因的。为什么要删除它?它没有害处。删除它没有任何好处。
  • .obj 文件元数据将在编译阶段全部剥离。您可以通过在可执行文件中查找元数据来轻松验证是否如此。
  • 一篇文章的另一个无耻插件解释了这里讨论的大部分内容:“在 Delphi 中使用 C 对象文件”,rvelthuis.de/articles/articles-cobjs.html
  • @RudyVelthuis 那篇文章相当不错。但现在有点过时了。以下是我认为缺少的问题: 1. 64 位 2. 提到Crtl 单元 3. 在支持 COFF 对象的 XE2 版本之后,关于 COFF 和 OMF 的讨论已经过时 4. 循环引用问题的讨论以及如何解决它们 (stackoverflow.com/questions/4638186/…)。
猜你喜欢
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
相关资源
最近更新 更多