有没有办法找到一个特定的gcc构建,它与正在构建的交换机有什么关系?
我听说在构建源代码的gcc构建时,有几个开关可以确定某些特定功能是否可用,例如Thread_posix
和/或Win32_thread
用于构建MingW
开关1}}在Windows
上,第一个允许使用std :: thread而另一个不允许,或sjlj
构建vs dwarf
构建处理异常(我不甚至不知道它们的用途!我只知道sjlj
构建在所有情况下都慢了15%!)
那么我可以做些什么来了解这些以及可能在这方面的更多信息?
答案 0 :(得分:4)
是。 gcc -v
的输出显示了您想要了解的所有内容。
例外是这样的:
--enable-dw2-exceptions
--enable-sjlj-exceptions
或者对于4.8之前的64位MinGW-w64 GCC没有任何内容。--enable-seh-exceptions
或GCC 4.8+ 64位MinGW-w64 GCC没有任何内容。这些可以从libgcc DLL名称中推断出来,该名称始终包含sjlj
,dw2
或seh
。
libgcc中使用的线程实现:
--enable-threads=win32
--enable-threads=posix
据我所知,这些不能从文件名中推断出来。
答案 1 :(得分:1)
在Windows上,使用最新的GCC版本(第4.8版后),情况如下:
对于异常处理模型dwarf/sjlj/seh
:
dwarf2
--with-dwarf2
应该被指定sjlj
--enable-sjlj-exceptions
应该被指定--disable-sjlj-execptions
异常处理,也可以使用sjlj
seh
sjlj
,这是默认设置。sjlj
--enable-sjlj-exceptions
应该被指定--disable-sjlj-execptions
异常处理,也可以使用sjlj
win64
的默认值为seh
异常对于线程模型win32/posix
:
win32
--enable-threads=win32
应该被指定win32
是默认的线程模型posix
--enable-threads=posix
应该被指定要弄清已构建的MinGW GCC的异常处理模型,请执行以下操作:
--enable-shared
构建的
bin
文件夹将libgcc
作为DLL libgcc
DLL具有一个前缀,指示正在使用的异常处理模型,该模型将是dw2/seh/sjlj
--disable-shared
构建的,它将变得更加复杂,您可以使用以下方法之一:
strings
和grep
命令的组合从静态libgcc.a
中找出来的信息,将在<GCC_buildroot>/lib/gcc/<target>/<version>/libgcc.a
可用,但是这次没有异常处理模型前缀
strings <GCC_buildroot>/lib/gcc/<target>/<version>/libgcc.a | grep personality
输出将包括以下之一:
sjlj
:__gcc_personality_sj0
dwarf2
:__gcc_personality_v0
seh
:__gcc_personality_seh0
g++ -dM -E -x c++ - < /dev/null
应存在以下其中一项
sjlj
:#define __USING_SJLJ_EXCEPTIONS__ 1
seh
:#define __SEH__ 1
dwarf2
:#define __GCC_HAVE_DWARF2_CFI_ASM 1
(对此不太确定)