Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用C';Delphi XE4 Win64平台中cl.exe编译的s.OBJ文件_Delphi_Coff_Cl.exe - Fatal编程技术网

无法使用C';Delphi XE4 Win64平台中cl.exe编译的s.OBJ文件

无法使用C';Delphi XE4 Win64平台中cl.exe编译的s.OBJ文件,delphi,coff,cl.exe,Delphi,Coff,Cl.exe,我想把7Zip的SDK翻译成Delphi/Pascal的单位文件。首先,我尝试使用Win32平台的BCC32.exe编译C文件: bcc32.exe -c -D_LZMA_PROB32 -D_WIN32 -v -y Threads.c LzFind.c LzFindMt.c LzmaDec.c LzmaEnc.c bcc64.exe -c -D_LZMA_PROB32 -D_WIN64 -v -y Threads.c LzFind.c LzFindMt.c LzmaDec.c LzmaEnc.

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

bcc32.exe -c -D_LZMA_PROB32 -D_WIN32 -v -y Threads.c LzFind.c LzFindMt.c LzmaDec.c LzmaEnc.c
bcc64.exe -c -D_LZMA_PROB32 -D_WIN64 -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.
然后,我尝试使用Win64平台的
BCC64.exe
编译这些对象文件:

bcc32.exe -c -D_LZMA_PROB32 -D_WIN32 -v -y Threads.c LzFind.c LzFindMt.c LzmaDec.c LzmaEnc.c
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
格式

然后我尝试使用Microsoft Windows SDK中的
cl.exe
生成Win32和Win32
.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
生成在Win32和Win64平台上都可以由Delphi单元编译的
.OBJ
文件?

有点混乱,但在Delphi中

  • 对于64位,您可以使用64位COFF文件,例如,由Microsoft的64位编译器生成。据报道,DelphiXE6 64位也可以链接64位ELF文件,因为C++Builder 64位生成了这些文件

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

有关该主题的更多信息:


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

我使用cl生成静态链接到
$link
的对象。我看不出你是如何试图这样做的,所以我不能告诉你什么是错的。很难知道你为什么问这个问题,却忽略了所有重要的细节。您为bcc32和bcc64提供了命令行,但没有为cl提供命令行,这正是您要问的!第一步是让一个简单的函数工作
int-sum(int-x1,int-x2){return x1+x2;}
一旦可以这样做,就让它更复杂。FWIW,当我这样做时,我对32位对象使用bcc32,对64位对象使用cl。在我看来,您的错误似乎来自32位Delphi编译器。我建议您继续使用32位bcc32。@DavidHeffernan:我编辑了主题并添加了Delphi示例和
cl.exe
编译选项。既然您已经有了32位的工作解决方案,为什么要更改它?就目前而言,我甚至不知道你问的是32位还是64位.FWIW,我从尝试过这一点(但我自己没有确认)的人那里听说XE6可以使用64位COFF和64位ELF文件。有没有一种简单的方法来为Win32和Win64平台构建Delphi单元?在声明中加入
\u PU
似乎是不够的。奇怪的是,人们投票的答案显然是错误的。投票真的很奇怪。也许收集民意代表的最佳策略是写下错误的答案,以此作为吸引选民的诱饵。否决票的目的不是要对人们进行仇恨,而是鼓励他们纠正或删除自己的答案。当鲁迪意识到自己的错误时,他当然会改正。我会取消否决票,一切都会好起来。第二点。仔细阅读艾伦在相关问题中的回答。第二个要点有什么问题?大多数Delphi版本需要32位OMF文件,但最新版本(不确定XE4是否也是如此)也允许使用32位COFF文件。请注意,它们必须是C对象文件,即使用C编译器编译(通常通过为源文件提供扩展名.C来实现)。@DavidHeffernan:好的,我重新排列了一下文本,并将关于32位COFF的语句拉到了项目符号中。