我想将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.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'
有什么想法可以用来在Win32和Win64平台cl.exe
上生成.OBJ
可能由Delphi单元编译的文件吗?
这有点令人困惑,但是在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链接的目标文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句