Невозможно использовать C.OBJ файлы, скомпилированные cl.exe на платформе Delphi XE4 Win64

Я хочу перевести SDK 7Zip в файл модуля Delphi/Pascal. Во-первых, я пытаюсь скомпилировать файлы C, используя BCC32.exe для платформы Win32:

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.exe для платформы Win64:

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.exe из Microsoft 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'

Любые идеи, как использовать cl.exe производить .OBJ файлы, которые могут быть скомпилированы модулем Delphi на платформе Win32 и Win64?

1 ответ

Решение

Это немного сбивает с толку, но в Delphi

  • для 64-битных можно использовать 64-битные файлы COFF, как, например, с помощью 64-битного компилятора Microsoft. Сообщается, что 64-разрядная версия Delphi XE6 способна также связываться с 64-разрядными файлами ELF, так как 64-разрядная версия C++Builder создает их.

  • для 32-битных можно использовать 32-битные объектные файлы OMF C, созданные C++Builder. Delphi XE2 и новее (см. Эту ссылку из комментария Дэвида Хеффернана) позволяют также ссылаться на 32-битный COFF.

Еще немного информации по теме: Использование объектных файлов на C в Delphi

Таким образом, начиная с Delphi XE6, вы на самом деле можете использовать C++Builder для генерации Delphi-связываемых объектных файлов для обеих платформ.

Другие вопросы по тегам