【问题标题】:64-bit version of GCC not compiling 64-bit exe64 位版本的 GCC 不编译 64 位 exe
【发布时间】:2022-01-13 12:57:54
【问题描述】:

我是 gcc 命令行 编译的初学者。 我需要关于 -m64 标志的帮助。

我使用 MinGW 安装了 gcc 编译器。 我通过以下方式检查了 gcc 版本, gcc -v 命令,显示Target: x86_64-w64-mingw32。 所以我假设安装了 64 位版本的 gcc。

目的:我写了一个小程序来检查main.exe是为32位还是64位生成的。

#include<stdio.h>

int main(void)
{
    printf("The Size is: %lu\n", sizeof(long));
    
    return 0;   
}

我使用以下命令编译,gcc -o main main.c。当我执行 main.exe 时,它​​会输出 The Size is: 4

但我希望输出是 `The Size is: 8'。

所以我将命令修改为gcc -m64 -o main main.c。当我再次执行 main.exe 时,它​​仍然输出 `The Size is: 4'

64位版本的exe如何编译?

【问题讨论】:

  • printf("The Size is: %lu\n", sizeof(long)); -> printf("The Size is: %zu\n", sizeof(void*));
  • A long 保证至少 32位。如果您想知道您编译的二进制文件是否为 64 位,请检查指针的大小,因为这就是 N 位存在的全部原因。 en.cppreference.com/w/cpp/language/types
  • 在 Windows 上,long 始终是 32 位的,你应该试试sizeof(void*)
  • windows 和 linux 都有办法检查可执行文件是 32 位还是 64 位。改用该方法,不能保证查看类型的大小。
  • @Jabberwocky,瑞典人,ssbssa。谢谢,现在很清楚了。程序运行成功。

标签: c++ c gcc


【解决方案1】:

正如其他人在 cmets 中所说,long 的大小在 64 位系统上可以是 8 或 4 个字节。你可以试试sizeof(size_t)sizeof(void*)。即使这在每个系统上都可能不可靠(但应该适用于 Windows、Linux、macOS)。

【讨论】:

  • 是的,正如您所说,它可能会起作用,但不能保证。最好使用操作系统功能来告诉您可执行文件是 32 位还是 64 位。
  • @Fredrik 原则上,我同意你的看法。但您可能需要一个可移植的、独立于操作系统的解决方案。
【解决方案2】:

x86_64-w64-mingw32: mingw32 是生成 32 位可执行文件的编译器。 你的包名中对 64bit 的引用表明这个编译器运行在 64bits 模式。

如果您不想生成 64 位可执行文件,则需要 mingw64 编译器: https://www.mingw-w64.org/

【讨论】:

  • x86_64-w64-mingw32 是目标名称。 AFAIK 它是 64 位 Windows 的正确目标。
  • mingw32 表示生成的二进制文件是 32 位的。 x86_64 意味着编译器可以在 x86_64 架构上运行。 w64 表示操作系统是 windows 96 位。
  • 对不起,但我很确定重要部分是“x86_64”和“w64”,它们表示硬件架构和操作系统(Windows 64 位)。
【解决方案3】:

这是一种更好的方法。

首先从 Microsoft https://docs.microsoft.com/en-us/sysinternals/downloads/sigcheck 下载 Sigcheck 然后运行如下:

C:\Sigcheck>sigcheck64.exe -u -e "C:\Sublime C++ Projects\runtime_measure.exe"

Sigcheck v2.82 - File version and signature viewer
Copyright (C) 2004-2021 Mark Russinovich
Sysinternals - www.sysinternals.com

c:\sublime c++ projects\runtime_measure.exe:
        Verified:       Unsigned
        Link date:      7:43 PM 12/8/2021
        Publisher:      n/a
        Company:        n/a
        Description:    n/a
        Product:        n/a
        Prod version:   n/a
        File version:   n/a
        MachineType:    64-bit

如您所见,在本例中,runtime_measure.exe 是一个 64 位二进制文​​件。

不要忘记给出正确的地址,以便终端可以从你放置的目录中找到并执行sigcheck64.exe

另外,请注意在命令中使用了两个参数-u-e

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 2012-01-03
    • 1970-01-01
    • 2022-01-13
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2011-02-11
    相关资源
    最近更新 更多