有没有办法找到构建mingw构建的交换机?

时间:2013-04-19 10:58:38

标签: gcc mingw

有没有办法找到一个特定的gcc构建,它与正在构建的交换机有什么关系? 我听说在构建源代码的gcc构建时,有几个开关可以确定某些特定功能是否可用,例如Thread_posix和/或Win32_thread用于构建MingW开关1}}在Windows上,第一个允许使用std :: thread而另一个不允许,或sjlj构建vs dwarf构建处理异常(我不甚至不知道它们的用途!我只知道sjlj构建在所有情况下都慢了15%!)
那么我可以做些什么来了解这些以及可能在这方面的更多信息?

2 个答案:

答案 0 :(得分:4)

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

例外是这样的:

  • 矮人:--enable-dw2-exceptions
  • sjlj:--enable-sjlj-exceptions或者对于4.8之前的64位MinGW-w64 GCC没有任何内容。
  • seh:--enable-seh-exceptions或GCC 4.8+ 64位MinGW-w64 GCC没有任何内容。

这些可以从libgcc DLL名称中推断出来,该名称始终包含sjljdw2seh

libgcc中使用的线程实现:

  • win32:默认值,可选--enable-threads=win32
  • posix:--enable-threads=posix

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

答案 1 :(得分:1)

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

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

    • win32目标版本
      1. 对于dwarf2
        • --with-dwarf2应该被指定
      2. 对于sjlj
        • --enable-sjlj-exceptions应该被指定
        • 如果您要强制禁用--disable-sjlj-execptions异常处理,也可以使用
        • sjlj
    • win64目标版本
      1. 对于seh
        • 无需指定任何内容。如果不使用sjlj,这是默认设置。
      2. 对于sjlj
        • --enable-sjlj-exceptions应该被指定
        • 如果您要强制禁用--disable-sjlj-execptions异常处理,也可以使用
        • sjlj
      • 注意:如果没有将异常处理参数传递给配置脚本,则win64的默认值为seh异常
  2. 对于线程模型win32/posix

    1. 对于win32
      • --enable-threads=win32应该被指定
      • 注意:如果没有将与线程相关的参数传递给配置脚本,则win32是默认的线程模型
    2. 对于posix
      • --enable-threads=posix应该被指定

要弄清已构建的MinGW GCC的异常处理模型,请执行以下操作:

  1. 如果正在查看的MinGW GCC是使用--enable-shared构建的
    • bin文件夹将libgcc作为DLL
    • libgcc DLL具有一个前缀,指示正在使用的异常处理模型,该模型将是dw2/seh/sjlj
    • 之一
  2. 如果要查看的MinGW GCC是使用--disable-shared构建的,它将变得更加复杂,您可以使用以下方法之一:
    1. 手动使用stringsgrep命令的组合从静态libgcc.a中找出来的信息,将在<GCC_buildroot>/lib/gcc/<target>/<version>/libgcc.a可用,但是这次没有异常处理模型前缀
      • strings <GCC_buildroot>/lib/gcc/<target>/<version>/libgcc.a | grep personality输出将包括以下之一:
        1. sjlj__gcc_personality_sj0
        2. dwarf2__gcc_personality_v0
        3. seh__gcc_personality_seh0
    2. 手动检查由GCC定义的指示异常处理模型的宏(不推荐)
      • g++ -dM -E -x c++ - < /dev/null应存在以下其中一项
        1. sjlj#define __USING_SJLJ_EXCEPTIONS__ 1
        2. seh#define __SEH__ 1
        3. dwarf2#define __GCC_HAVE_DWARF2_CFI_ASM 1 (对此不太确定)