使用新的C ++ obj文件,不满意的前向或外部声明

时间:2013-08-06 08:22:32

标签: visual-studio delphi delphi-xe4

我下载了一个免费的Delphi组件,用于处理BZip2-archives: http://www.torry.net/vcl/compress/other/BZip21.05.zip (更有经验的单位AbBzip2.pas组件Abbrevia 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,尝试重新编译组件。

  9. 获取错误“[dcc32错误] AbBzip2.pas(215):E2065不满意的前向或外部声明:'BZ2_hbMakeCodeLengths'”和其他类似的声明。

    或对于bzip2.bas - [dcc32错误] BZip2.pas(171):E2065不满意的前向或外部声明:'_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文件。

1 个答案:

答案 0 :(得分:3)

Pascal文件旨在与.obj文件一起使用,这些文件以非常特定的方式编译。您无法使用bzip2 makefile进行编译。您需要以与Delphi库兼容的特定方式编译文件。

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

bzip2 SDK v1.0.6

Original download available from http://bzip.org/1.0.6/bzip2-1.0.6.tar.gz

Compile 32-bit with
  bcc32 -q -c -u- -w-8004 -w-8008 -w-8057 -w-8066 -w-8068 -DBZ_NO_STDIO *.c

Compile 64-bit with
  cl -c -nologo -GS- -Z7 -wd4068 -Gs32768 -DBZ_NO_STDIO *.c

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

在您的问题中,您声明Abbrevia中使用的bzip2文件已过期,并且您要使用1.0.6。那个说法不对。你显然已经有了Abbrevia的过时版本。

你应该从sourceforge repo中提取最新版本的Abbrevia,并附带bzip2 1.0.6的.obj文件。正是你在寻找什么。如果您希望对bzip2源代码文件进行一些修改,可以使用上面的命令行重新编译它们。