Windows下的Qt编译器——MinGW和MSVC的区别

Windows下的Qt编译器——MinGW和MSVC的区别

两者的区别


  • MSVC
    即Microsoft Visual C++ Compiler,即微软自己的编译器
    我们下载Windows下的OpenCV时,会带两个文件夹VC14,VC15(分别与Visual Studio的版本有对应关系),这两个文件夹下的库可以直接运行不需要编译
    将VS作为Qt的开发环境也是使用这个编译器的缘故

  • MinGW
    我们都知道GNU在Linux下面鼎鼎大名的gcc/g++,MinGW则是指Minimalist GNU for Windows的缩写
    它是将GNU开发工具移植到Win32平台下的产物,即一套Windows上的GNU工具集
    用其开发的程序不需要额外的第三方DLL支持就可以在Windows下运行,相对地,不使用动态库导致的就是编译出来的程序大很多。也是可以设置使用静态库的

Qt 用 MSVC 和 MinGW 哪个编译器编译程序比较好?

请问在开发 Qt 程序时,MSVC 与 MinGW 两种编译器哪种更易于上手、出现 bug 的概率低些呢?

有点懒得装 VS2017 了,不知道大家什么意见呢?哈哈

----

作者:电子爱好者加加
链接:https://www.zhihu.com/question/331375227/answer/1212262067
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

我的建议是使用MSVC。

理由一:qtcreator的debuger有功能缺陷,经常会出现变量无法查看的问题,棘手的bug还是需要在VS环境下进行调试。很多人的开发模式就是qtcreator写代码,VS下面做调试。

理由二:MinGW无法直接生成PDB文件,这导致如果软件闪退,无法利用生成的dump文件在windbg或VS下面定位到出错的代码。(有各种奇技淫巧可以在windows下面对mingw版本进行dump调试,但有这功夫直接安装个VS 2017显然更香)。

理由三:我的经验告诉我,MinGW编译出的软件总会有奇怪的无法运行现象。

实战经历1:Scene3D在MinGW64位Release和MinGW32位Debug模式下运行直接闪退,而64位Debug和32位Release却正常运行。

实战经历2:动态删除继承QuickItem的对象,有几率导致非法内存访问,可以定位到问题在Qt源码中Renderer中的一处。

类似以上例子的幺蛾子在我切换到MSVC之后不再出现,我甚至怀疑QT的开发人员在windows下更倾向于MSVC进行测试,导致我上报的MinGW中发现的bug都无法被他们重现并重视。

关于第三点再做补充,我认为在任何平台下,越贴近原生的东西总能得到更多的优化,MinGW始终不是Windows亲生的,bug比亲生的VS多很正常。

关于如何对闪退软件进行dump调试,可以查看我的另一篇文章。

厄兰德森:你开发的软件不知道哪里跑飞闪退了?这个办法可以帮忙定位​zhuanlan.zhihu.com

对于另一个回答中提到的MSVC中rc文件编译失败重新编译没问题这种情况,根本不能称之为编译器bug,我更愿意把它称之为玄学。

真正令人不安的是由于不同编译器之间,或同个编译器Release、Debug模式之间,指针初始化或指针回收处理的差异,以及官方的开发人员没有进行详尽的测试,最终导致的野指针非法访问问题。甚至官方example使用MinGW编译都存在无法运行的现象,让我有理由相信官方团队对MinGW环境做的测试不够详尽。

 

 

 

 

以下是一个简单的GAT(Graph Attention Network)图神经网络的代码示例: ```python import torch import torch.nn as nn import torch.nn.functional as F class GATLayer(nn.Module): def __init__(self, in_features, out_features, dropout=0.6, alpha=0.2): super(GATLayer, self).__init__() self.dropout = dropout self.alpha = alpha self.W = nn.Linear(in_features, out_features, bias=False) self.a = nn.Linear(2*out_features, 1, bias=False) def forward(self, X, adj_matrix): h = self.W(X) N = h.size(0) a_input = torch.cat([h.repeat(1, N).view(N*N, -1), h.repeat(N, 1)], dim=1).view(N, -1, 2*h.size(1)) e = F.leaky_relu(self.a(a_input).squeeze(2), negative_slope=self.alpha) zero_vec = -9e15*torch.ones_like(e) attention = torch.where(adj_matrix > 0, e, zero_vec) attention = F.softmax(attention, dim=1) attention = F.dropout(attention, p=self.dropout, training=self.training) h_prime = torch.matmul(attention, h) return F.elu(h_prime) class GAT(nn.Module): def __init__(self, in_features, hidden_features, out_features, num_layers, dropout=0.6, alpha=0.2): super(GAT, self).__init__() self.hidden_features = hidden_features self.num_layers = num_layers self.layers = nn.ModuleList([GATLayer(in_features, hidden_features, dropout=dropout, alpha=alpha)]) self.layers.extend([GATLayer(hidden_features, hidden_features, dropout=dropout, alpha=alpha) for _ in range(num_layers-2)]) self.layers.append(GATLayer(hidden_features, out_features, dropout=dropout, alpha=alpha)) def forward(self, X, adj_matrix): h = X for layer in self.layers: h = layer(h, adj_matrix) return h ``` 这是一个简单的GAT图神经网络的实现,包括了GATLayerGAT两个类。GATLayer定义了一个GAT层的操作,GAT则将多个GAT层串联起来构成整个图神经网络。其中,in_features表示输入特征的维度,hidden_features表示隐层特征的维度,out_features表示输出特征的维度,num_layers表示GAT层数,dropout表示dropout率,alpha表示LeakyReLU的斜率。 希望这个代码示例对你有帮助!如有任何问题,请随时提问。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值