Browsed by
Tag: vc

QT SDK与C4100编译告警

QT SDK与C4100编译告警

“warning C4100: … unreferenced formal parameter.”

QT SDK (VC2008)在使用qmake生成makefile文件时,缺省会打开C4100的编译告警开关。就我们的开发实践来说,C4100实在是个多余的告警,尤其是在C++程序中,我们经常定义一些虚函数等作为接口类,这些虚函数本身基本是空函数,由派生类重载出具体的实现。一旦放开C4100告警,VC编译器就看这些函数中没有引用的形参非常不爽,频频给出告警,实在是烦人。

我们可以在头文件中要求编译器忽略C4100告警:

#pragma warning( push )

#pragma warning( disable : 4100 )

void fun1(…){}

#pragma warning( pop )

这样做也有不好的一面,我们不得不修改.h文件,包括一些第三方库的头文件。另外,这似乎也破坏了跨平台的特性,和VC编译器绑定过紧(?不清楚其他编译器,例如gcc,是否也支持这种预处理指令)。

我们决定直接关掉C4100告警,修改以下文件(qt安装在d:\qt\4.6.2目录):

D:\Qt\4.6.2\mkspecs\win32-msvc2008\qmake.conf

在这个文件中,找到QMAKE_CXXFLAGS_WARN_ON,将它后面的-w34100删除掉。

然后回到自己的工程,重新用qmake生成makefile,此时再编译,就不会有C4100告警了。

小红伞怎么了?

小红伞怎么了?

最近软件开发过程中,遇到一些莫名其妙的问题,例如,在VC2008 Expess环境中,一运行程序就弹出以下信息并结束调试:

the application failed to initialize properly (0xc0000235)

其他一些程序即使是运行起来了,也会有其他一些问题,例如打开对话框崩溃等等。

而在这期间,我们的代码没有任何改动,以前是好好的。

这个问题严重困扰了我们,不同程序出错的位置还不一样,有些甚至连main都没有执行到!我们为了排查,做了以下工作:

(1)重建所有工程,删除所有obj文件,重新编译。结果仍然异常。

(2)接下来只好重装VC2008 Express,重复第一步的操作,结果还是异常。

(3)重新安装QT,并尝试不同的版本,其间包括了对4.6.2, 4.6.3, 4.7的源代码重新编译(每次编译都耗费了3~4小时)!结果还是异常。

这不得不让我们怀疑是其他部分的问题了。在Google上搜索了最近一个月类似的问题,发现国外有用户提到了小红伞。恰好我们的环境中也安装了小红伞杀毒,于是我们也尝试卸载小红伞试试,结果果然是小红伞的问题!卸载完了后,一切恢复正常了!

小红伞在最近的升级过程中,究竟干了什么?

按条件编译版本

按条件编译版本

在我们开发的软件中,需要根据宏定义的不同,区分编译出不同的版本。例如,代码中有如下定义:

#if MSS_USER_VERSION == 1000
… …
#elif MSS_USER_VERSION == 100
… …

比较丑陋的方式,当然可以在代码中先定义好MSS_USER_VERSION ,然后再编译版本。但是我们通常采用自动化脚本编译,上述做法无法自动进行区分,需要人工干预。

我们希望在脚本执行时能通过设置不同的环境变量,从而自动编译出相应的执行文件。

以上述代码为例,我们可以修改qt的pro文件,增加如下定义即可:

DEFINES += MSS_USER_VERSION=$$(MSS_USER_VERSION)

脚本在编译前,先设置好环境变量,编译不同的版本,设置不同的环境变量值即可:

set MSS_USER_VERSION=1000

最后,如果只是单纯编译console程序,需要显示地在pro文件中说明,否则qmake缺省会按照window程序编译,导致在命令行中无法看到输入输出信息。

CONFIG += console

VC 2008 Express编译QT程序时产生MAP文件

VC 2008 Express编译QT程序时产生MAP文件

MAP文件对于定位程序crash问题非常有用,一般情况下,我们总是希望能产生MAP文件以便将来出问题时好进行查找。

在VC 2008 Express中生成MAP文件比较简单,只需要修改工程属性中的link相关项即可。

可是在QT应用中,如何设置呢?这种情况下,是先使用qmake编译pro文件,然后使用VC的命令行方式编译程序,没有相应的VC工程进行设置。

我们可以修改QT在VC2008环境下的全局编译、链接开关。以QT4.6.2为例,假设qt安装在d:/qt/4.6.2目录下。

进入qt安装目录下的子目录: mkspecs\win32-msvc2008

用notepad打开该目录下的qmake.conf文件,找到QMAKE_LFLAGS项,将其修改为:

QMAKE_LFLAGS            = /NOLOGO /MAP /MAPINFO:EXPORTS

注意,全部都是需要大写格式。

修改完成后,重新qmake各pro工程文件并编译,就会在生成exe/dll/lib的同时,生成map文件。

上述方法修改的是QT全局的qmake连接标志,编译任何工程都会产生map文件。在实际应用中,我们可能只是希望部分工程产生map文件,这种情况下可以修改工程的pro文件,单独添加QMAKE_LFLAGS即可:

QMAKE_LFLAGS         += /MAP /MAPINFO:EXPORTS