bat脚本根据mingw版本判断是否可编译32/64位程序

MinGW编译器是否可以编译32/64位程序,取决于MinGW的版本。
一般我们下载的mingw-w64版本名是类似下面这样的名字:

i686-5.2.0-posix-dwarf-rt_v4-rev1
x86_64-5.2.0-posix-seh-rt_v4-rev1
x86_64-5.2.0-posix-sjlj-rt_v4-rev1

开始的i686,x86_64好理解,代表适用的处理器架构,i686代表是32位处理器,x86_64则代表64位处理器,
posix则代表线程模式(threading model),windows下还有另一种线程模式win32,这里不展开说明。
i686前缀的版本肯定可以编译32位程序,但是否能编译64位程序则取决于编译器版本的所用的异常实现模型–dwarf,seh,sjlj。

关于异常实现模型的概念还是看本文末尾的参考资料一节中列出的英文原文说得全面,下面是dwarf,seh,sjlj三种模型的简要介绍。

SJLJ (setjmp/longjmp): – available for 32 bit and 64 bit – not “zero-cost”: even if an exception isn’t thrown, it incurs a minor performance penalty (~15% in exception heavy code) – allows exceptions to traverse through e.g. windows callbacks

DWARF (DW2, dwarf-2) – available for 32 bit only – no permanent runtime overhead – needs whole call stack to be dwarf-enabled, which means exceptions cannot be thrown over e.g. Windows system DLLs.

SEH (zero overhead exception) – will be available for 64-bit GCC 4.8.

通过这个简介可以知道
sjlj适合32/64位程序(但是它会带来轻微的性能损失,在异常重的代码中有15%),
dwarf则只能用于32位程序,
seh只能用于64位程序
所以根据这个就可以知道前面列出的三个mingw-w6版本是否能编译32/64位程序了。

gcc有命令行参数--version可以返回编译器的版本信息,如下。

J:\jpegwrapper>gcc --version
gcc (x86_64-posix-seh-rev1, Built by MinGW-W64 project) 5.2.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

所以,通过上面的版本信息,允许在执行脚本时判断编译的编译能力:

下面的bat脚本片段展示如何利用--version参数来判断编译是否能编译32/64位代码:

where gcc
rem 判断是否安装了gcc,没有就退出
if errorlevel 1 (
	echo MinGW/gcc NOT FOUND.
	exit -1
)
echo MinGW/gcc found.
rem 通过查找版本信息中是否有sjlj或seh字符串的判断是否能编译64位程序
gcc --version |findstr "sjlj seh"
if errorlevel 1 (
	echo unsupported x86_64 build
	)else call:gcc_x86_64 
	
rem 通过查找版本信息中是否有sjlj或dwarf字符串的判断是否能编译32位程序
gcc --version |findstr "sjlj dwarf"
if errorlevel 1 (
	echo unsupported x86 build	
	)else call:gcc_x86
goto :end

参考资料

《What is difference between sjlj vs dwarf vs seh?》

《Exception handling: SJLJ, DWARF, and SEH》

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 这是一个在 Windows 系统上打开命令提示符的命令。其中: C:\Windows\System32\cmd.exe 是命令提示符的路径。 /A 和 /Q 选项是 cmd.exe 的命令行参数,分别表示将输出设置为 ANSI 或不显示询问消息。 /K 代表运行命令后不关闭命令提示符。 E:\Qt\Qt5.13.2\5.13.2\mingw73_64\bin\qtenv2.bat 是一个批处理文件,运行它会在命令提示符窗口中执行其中的命令。这个文件用于配置 Qt 的运行环境。 ### 回答2: C:\Windows\System32\cmd.exe /A /Q /K E:\Qt\Qt5.13.2\5.13.2\mingw73_64\bin\qtenv2.bat 是一个用于执行Qt开发环境的命令行脚本。在这个命令行中,"C:\Windows\System32\cmd.exe" 是Windows系统中的命令提示符程序的路径,用于启动命令行界面;"/A" 参数表示以ASCII模式打开文件,是一种文件的打开方式;"/Q" 参数表示以安静模式执行命令,不输出额外的信息;"/K" 参数表示执行完命令后,保持命令行界面开启;"E:\Qt\Qt5.13.2\5.13.2\mingw73_64\bin\qtenv2.bat" 是一个存储Qt环境变量的批处理脚本的路径。 执行这个命令行后,会启动命令行界面,然后打开文件 "E:\Qt\Qt5.13.2\5.13.2\mingw73_64\bin\qtenv2.bat" 并执行其中的命令。该脚本设置了Qt开发环境所需的一些路径和变量,包括将Qt相关的可执行文件所在的路径添加到系统的环境变量中,以便在命令行界面中直接执行Qt工具和编译程序。 通过执行这个命令行,可以方便地进入Qt开发环境,并且随时使用Qt的工具和编译程序来开发和调试Qt应用程序
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值