【问题标题】:Force LP64 data model with GCC or Clang in Windows在 Windows 中使用 GCC 或 Clang 强制 LP64 数据模型
【发布时间】:2018-08-24 23:43:56
【问题描述】:

有没有办法强制 GCC 和/或 Clang 编译器在面向 Windows 时使用 LP64 数据模型(忽略 Windows 使用 LLP64 数据模型)?

【问题讨论】:

  • 为什么你想这样做?您想通过这样做解决什么实际问题?
  • @Someprogrammerdude 编译一些依赖long 的遗留代码等于指针大小。我知道还有其他解决方案,但我只想要一个(如果可能的话)。

标签: c gcc window clang


【解决方案1】:

不,因为请求的功能不起作用

您“以 Windows 为目标”,大概意味着您希望编译器生成将在 Windows 下以通常方式运行的代码。为此,程序必须调用 Windows API 中的函数。实际上有three versions of the Windows API:win16、win32和win64。由于您需要 64 位指针(“LP64”中的“P64”),因此唯一可能的目标是 win64。

为了调用一个win64函数,你必须包含windows.h。该头文件使用long。如果有编译器开关坚持将 long 视为 64 位整数 (LP64) 而不是 32 位 (LLP64),那么编译器对如何调用函数和布局使用 @987654326 的数据结构的理解@ 是错误的;生成的程序将无法正确运行。

同样的问题也适用于标准 C 和 C++ 库。如果您链接到现有的已编译库(通常),对它的调用将不起作用(因为它将使用 LLP64)。如果您要使用假设开关强制 LP64 从源代码构建一个,它对 Windows API 的调用将失败。

不过你可以试试 Cygwin

Cygwin 使用 LP64 并生成在 Windows 上运行的二进制文件。尽管我在上面写过,但这是可能的,因为 Cygwin DLL 充当了 Cygwin LP64 环境和本机 win64 LLP64 环境之间的桥梁。假设您的代码最初是为 win32 编写的,而您现在想要利用 64 位地址空间而无需更改或更改最少的代码,我怀疑这是最简单的路径。但我应该承认,我从未以这种方式使用过 Cygwin,因此可能存在我不知道的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多