Gcc 有没有办法找到构建mingw的开关?

Gcc 有没有办法找到构建mingw的开关?,gcc,mingw,Gcc,Mingw,有没有一种方法可以找到一个特定的gcc构建,它是用哪个交换机构建的? 我听说,在用其源代码构建gcc构建时,有两个开关可确定某些特定功能是否可用,例如Thread\u posix和/或Win32\u Thread开关用于在Windows上构建MingW,第一个允许使用std::thread,另一个不允许,或者sjljbuild与dwarfbuilds相比,后者处理异常(我甚至不知道它们的用途!我只知道sjljbuild在所有情况下都要慢15%! 那么,我还能做些什么来了解这些,以及这方面的更多信

有没有一种方法可以找到一个特定的gcc构建,它是用哪个交换机构建的?
我听说,在用其源代码构建gcc构建时,有两个开关可确定某些特定功能是否可用,例如
Thread\u posix
和/或
Win32\u Thread
开关用于在
Windows
上构建
MingW
,第一个允许使用std::thread,另一个不允许,或者
sjlj
build与
dwarf
builds相比,后者处理异常(我甚至不知道它们的用途!我只知道
sjlj
build在所有情况下都要慢15%!

那么,我还能做些什么来了解这些,以及这方面的更多信息呢

是的。
gcc-v
的输出显示了您想要知道的所有内容

例外情况如下:

  • dwarf:
    --启用-dw2-异常
  • sjlj:
    ——为4.8 64位之前的MinGW-w64 GCC启用sjlj异常
    或不启用
  • seh:
    --为GCC 4.8+64位MinGW-w64 GCC启用seh异常
    或不启用
这些可以从libgcc DLL名称中推断出来,该名称始终包含
sjlj
dw2
seh

libgcc中使用的线程实现:

  • win32:默认值,可选
    --启用线程=win32
  • posix:
    --启用线程=posix

据我所知,这些不能从文件名中推断出来。

在Windows上,使用最新的GCC版本(4.8版后),情况如下:

  • 对于异常处理模型
    dwarf/sjlj/seh

    • win32目标版本
    • 对于
      dwarf2
      • ——应指定with-F2
    • 对于
      sjlj
      • --应指定启用sjlj异常
      • ——如果要强制禁用
        sjlj
        异常处理,也可以使用禁用sjlj执行选项
    • win64目标版本
    • 对于
      seh
      • 不需要指定任何内容。这是未使用
        sjlj
        时的默认值
    • 对于
      sjlj
      • --应指定启用sjlj异常
      • ——如果要强制禁用
        sjlj
        异常处理,也可以使用禁用sjlj执行选项
      • 注意:如果未向配置脚本传递异常处理参数,则
        win64
        上的默认值为
        seh
        异常
  • 对于线程模型win32/posix

  • 对于win32
    • 应指定启用线程=win32
    • 注意
      win32
      是默认的线程模型,前提是没有向配置脚本传递与线程相关的参数
  • 对于
    posix
    • 应指定启用线程=posix
  • 要了解已构建的MinGW GCC的异常处理模型,请执行以下操作:

  • 如果正在查看的MinGW GCC是使用
    --enable shared
    • bin
      文件夹将
      libgcc
      作为DLL
    • libgcc
      DLL将有一个前缀,指示正在使用的异常处理模型,该模型将是
      dw2/seh/sjlj
  • 如果正在查看的MinGW GCC是使用
    --disable shared
    构建的,那么它会变得更加复杂,您可以使用以下方法之一:
  • 手动使用
    strings
    grep
    命令的组合,从静态
    libgcc中找出它。a
    将在
    /lib/gcc///libgcc.a
    中提供,这次它不会有异常处理模型前缀
    • strings/lib/gcc///libgcc.a | grep personality
      输出将包括以下内容之一:
    • sjlj
      \uugcc\u personality\usj0
    • dwarf2
      \ugcc\uv0
    • seh
      \uugcc\useh0
  • 手动检查GCC定义的宏,这些宏指示异常处理模型(不受欢迎)
      >代码> G++-DM -E-XC++()
    • sjlj
      使用异常定义
    • seh
      定义
    • dwarf2
      #定义uuu GCC_u拥有u dwarf2\ucfi_asm1
      (对这个不太确定)

  • 谢谢,当我尝试运行gcc-v时,我遇到了“程序太大,无法放入内存”的错误!我该怎么办?它应该像这样打印。我想你们的工具链()会在我的系统上打印出来。谢谢,我重新启动了我的系统,再试了一次,效果很好:)你们怎么知道这些东西?!欢迎来到Stackoverflow.com,那里(几乎)总是有人知道你想知道什么<代码>;-)在我的例子中,我构建了MinGW-w64工具链(binutils+GCC+gdb和Clang),所以我解决了这一切。再次感谢您的帮助;)