0

我想将 7Zip 的 SDK 翻译成 Delphi/Pascal 的单元文件。首先,我尝试编译BCC32.exe用于​​ Win32 平台的 C 文件:

bcc32.exe -c -D_LZMA_PROB32 -D_WIN32 -v -y Threads.c LzFind.c LzFindMt.c LzmaDec.c LzmaEnc.c

它产生的文件很少.OBJ,我可以毫无问题地在 Delphi 单元中使用这些对象。

unit Threads;

interface

uses System.Win.Crtl, Winapi.Windows, LzmaTypes, System.Classes;

{$Z4}
type
  TCEvent = THandle;

  TCSemaphore = THandle;

  TCCriticalSection = TRTLCriticalSection;

  TCAutoResetEvent = TCEvent;

  TCThread = THandle;

  TThread_Func_Type = Pointer;

function __beginthreadex(__security_attr: Pointer; __stksize: Cardinal; __start:
    TThread_Func_Type; __arg: Pointer; __create_flags: Cardinal; var
    __thread_id: Cardinal): Cardinal; cdecl; external msvcrt name _PU +
    '_beginthreadex';

function _Event_Reset(var p: TCEvent): TWRes; cdecl; external name _PU +
    'Event_Reset';

function _Event_Set(var p: TCEvent): TWRes; cdecl; external name _PU +
    'Event_Set';

function _Handle_WaitObject(h: THandle): TWRes; cdecl; external name _PU +
    'Handle_WaitObject';

function _Semaphore_Release1(var p: TCSemaphore): TWRes; cdecl; external name
    _PU + 'Semaphore_Release1';

function _HandlePtr_Close(var h: THandle): TWRes; cdecl; external name _PU +
    'HandlePtr_Close';

function _CriticalSection_Init(var p: TCCriticalSection): TWRes; cdecl; external
    name _PU + 'CriticalSection_Init';

function _AutoResetEvent_CreateNotSignaled(var p: TCAutoResetEvent): TWRes;
    cdecl; external name _PU + 'AutoResetEvent_CreateNotSignaled';

function _Semaphore_Create(var p: TCSemaphore; initCount: UInt32; maxCount:
    UInt32): TWRes; cdecl; external name _PU + 'Semaphore_Create';

function _Thread_Create(var p: TCThread; func: TThread_Func_Type; param:
    LPVOID): TWRes; cdecl; external name _PU + 'Thread_Create';

implementation

{$ifdef Win64}
  {$L Win64\Threads.o}
{$else}
  {$L Win32\Threads.obj}
{$endif}

end.

然后我尝试使用BCC64.exeWin64 平台编译这些目标文件:

bcc64.exe -c -D_LZMA_PROB32 -D_WIN64 -v -y Threads.c LzFind.c LzFindMt.c LzmaDec.c LzmaEnc.c

这一次,它产生的文件很少,.o但在编译 Delphi 单元时出现错误:

[dcc64 Fatal Error] LzFind.pas(128): F2084 Internal Error: AV0756F5D3-R2D06DB90-0

我了解到 Delphi Win64 识别的目标文件格式是 64 位 COFF,而 BCC64.exe 生成ELF64格式。

然后我尝试使用cl.exeMicrosoft Windows SDK 生成 Win32 和 Win64.OBJ文件,

cl.exe -c -D_LZMA_PROB32 -D_WIN32 Threads.c LzFind.c LzFindMt.c LzmaDec.c LzmaEnc.c

x86_amd64\cl.exe -c -D_LZMA_PROB32 -D_WIN64 Threads.c LzFind.c LzFindMt.c LzmaDec.c LzmaEnc.c

但我收到这些错误:

[dcc32 Error] Threads.pas(64): E2065 Unsatisfied forward or external declaration: '__imp__CloseHandle@4'
[dcc32 Error] Threads.pas(64): E2065 Unsatisfied forward or external declaration: '__imp__GetLastError@0'
[dcc32 Error] Threads.pas(64): E2065 Unsatisfied forward or external declaration: '__imp__InitializeCriticalSection@4'

任何想法如何使用在 Win32 和 Win64 平台cl.exe上生成.OBJ可由 Delphi 单元编译的文件?

4

1 回答 1

2

这有点令人困惑,但在 Delphi 中,

  • 对于 64 位,您可以使用由例如 Microsoft 的 64 位编译器生成的 64 位 COFF 文件。据报道,Delphi XE6 64 位也能够链接 64 位 ELF 文件,因为 C++Builder 64 位生成它们。

  • 对于 32 位,您可以使用由 C++Builder 生成的32 位 OMF C目标文件。Delphi XE2 和更新版本(请参阅David Heffernan 评论中的此链接)也允许您链接到 32 位 COFF。

有关该主题的更多信息:在 Delphi 中使用 C 目标文件

因此,从 Delphi XE6 开始,您实际上可以使用 C++Builder 再次为两个平台生成 Delphi 可链接的目标文件。

于 2014-07-22T09:05:11.883 回答