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

周志扬

我想将7Zip的SDK转换为Delphi / Pascal的单位文件。首先,我尝试使用BCC32.exeWin32平台编译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单元编译的文件吗?

鲁迪·维特胡斯(Rudy Velthuis)

这有点令人困惑,但是在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Delphi XE4中的CharInSet编译器警告

来自分类Dev

Delphi XE4中的编译错误

来自分类Dev

Delphi XE4中的EDOMParseError

来自分类Dev

Delphi XE4中的EDOMParseError

来自分类Dev

在Delphi XE4中如何对CSIDL或KNOWFOLDERID进行条件编译?

来自分类Dev

如何在Delphi XE4中对CSIDL或KNOWFOLDERID进行条件编译?

来自分类Dev

如何在Delphi Xe4中读取相当简单的JSON文件?

来自分类Dev

如何在Delphi Xe4中读取相当简单的JSON文件?

来自分类Dev

Delphi XE4 64位内存不足

来自分类Dev

Delphi XE4 RAD Studio中的DFM布局问题

来自分类Dev

Delphi XE4 RAD Studio中的DFM布局问题

来自分类Dev

W1000符号'THintInfo'在Delphi XE4中已弃用的编译器警告

来自分类Dev

需要在我的 Delphi xe4 IDE 中识别这个“编译前出现”对话框

来自分类Dev

安装Delphi XE4时,在Delphi XE2中丢失了TeeChart / TChart

来自分类Dev

Delphi 7和Delphi XE4中的解压缩流

来自分类Dev

Delphi 7和Delphi XE4中的解压缩流

来自分类Dev

在Delphi XE4中使用类似于数组字节的AnsiString

来自分类Dev

使用Delphi(XE4)和Word_Tlb合并表中的单元格

来自分类Dev

使用TXMLTransformProvider组件的Delphi XE4中的&和CRLF问题的解决方法

来自分类Dev

如何在Delphi XE4中注册Active X .ocx库

来自分类Dev

可以在Delphi XE4中禁用E2064吗?

来自分类Dev

在Delphi XE4中突出显示变量和函数名称

来自分类Dev

标签和速度按钮未在玻璃框架中显示-Delphi XE4

来自分类Dev

TpFIBTransaction提供错误:在带有FIBPlus 7.5的Delphi XE4中,事务未激活

来自分类Dev

无需安装即可将LockBox3与Delphi XE4一起使用

来自分类Dev

从Delphi XEx(XE4)调试Dylib

来自分类Dev

字符串[80]与Delphi 7和Delphi XE4中的字符串之间的区别

来自分类Dev

E2010不兼容的类型:Delphi XE4中的“ LPQUERY_SERVICE_CONFIGW”和“ PQueryServiceConfigA”错误

来自分类Dev

E2010不兼容的类型:Delphi XE4中的“ LPQUERY_SERVICE_CONFIGW”和“ PQueryServiceConfigA”错误

Related 相关文章

  1. 1

    Delphi XE4中的CharInSet编译器警告

  2. 2

    Delphi XE4中的编译错误

  3. 3

    Delphi XE4中的EDOMParseError

  4. 4

    Delphi XE4中的EDOMParseError

  5. 5

    在Delphi XE4中如何对CSIDL或KNOWFOLDERID进行条件编译?

  6. 6

    如何在Delphi XE4中对CSIDL或KNOWFOLDERID进行条件编译?

  7. 7

    如何在Delphi Xe4中读取相当简单的JSON文件?

  8. 8

    如何在Delphi Xe4中读取相当简单的JSON文件?

  9. 9

    Delphi XE4 64位内存不足

  10. 10

    Delphi XE4 RAD Studio中的DFM布局问题

  11. 11

    Delphi XE4 RAD Studio中的DFM布局问题

  12. 12

    W1000符号'THintInfo'在Delphi XE4中已弃用的编译器警告

  13. 13

    需要在我的 Delphi xe4 IDE 中识别这个“编译前出现”对话框

  14. 14

    安装Delphi XE4时,在Delphi XE2中丢失了TeeChart / TChart

  15. 15

    Delphi 7和Delphi XE4中的解压缩流

  16. 16

    Delphi 7和Delphi XE4中的解压缩流

  17. 17

    在Delphi XE4中使用类似于数组字节的AnsiString

  18. 18

    使用Delphi(XE4)和Word_Tlb合并表中的单元格

  19. 19

    使用TXMLTransformProvider组件的Delphi XE4中的&和CRLF问题的解决方法

  20. 20

    如何在Delphi XE4中注册Active X .ocx库

  21. 21

    可以在Delphi XE4中禁用E2064吗?

  22. 22

    在Delphi XE4中突出显示变量和函数名称

  23. 23

    标签和速度按钮未在玻璃框架中显示-Delphi XE4

  24. 24

    TpFIBTransaction提供错误:在带有FIBPlus 7.5的Delphi XE4中,事务未激活

  25. 25

    无需安装即可将LockBox3与Delphi XE4一起使用

  26. 26

    从Delphi XEx(XE4)调试Dylib

  27. 27

    字符串[80]与Delphi 7和Delphi XE4中的字符串之间的区别

  28. 28

    E2010不兼容的类型:Delphi XE4中的“ LPQUERY_SERVICE_CONFIGW”和“ PQueryServiceConfigA”错误

  29. 29

    E2010不兼容的类型:Delphi XE4中的“ LPQUERY_SERVICE_CONFIGW”和“ PQueryServiceConfigA”错误

热门标签

归档