再论Windows下配置编译Qt静态链接库 - 错误,永远是错误

本文记录了解决Qt环境下qconfig.cpp文件编译失败的过程,通过修改configure.exe源代码成功生成qconfig.cpp文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    在完成了上一篇《 Windows环境下设置Qt编译环境 - 关于Qt的静态链接库的配置和生成方法》之后,自己继续在玩儿Qt。过了没多久,该死的操作系统越来越慢,瘫痪了。只要重新来一遍。同样因为某些原因,我重新安装了Qt,并且编译,老黄历了。然而一切事情都不是自己想象的那么简单。按照老办法,无法编译通过....... -.  - u

 

    其实后来才知道,在整个编译过程中,错误从一开始就出现了。

    首先是利用configure.exe程序对当前的运行环境进行配置:

  • 分析命令行参数列表;
  • 提示Qt的用户软件协议并判定用户所使用的软件协议是否有效;
  • 验证软件系统环境配置情况;
  • 判定用户编译库文件所使用的软件工具和库文件信息,生成qmake工具的配置信息;
  • 生成编译整个Qt文件的配置信息qconfig等其他信息;
  • 编译qmake工具;
  • 利用Qmake工具扫描src目录下各个qt module中的pro配置文件,生成各个库文件的makefile;

   然后在configure配置编译环境完成之后,我们的批处理文件就开始使用nmake工具对配置好的qt环境进行编译。

 

   其实上面第一步一切顺利的话,编译整个Qt环境是不难的。然后,今天我偏巧这么倒霉,在configure编译生成qmake工具的时候,就出错了。cl.exe程序在编译源文件“qlibraryinfo.cpp”的时候,在line 65行中

 

#include "qconfig.cpp"

    

    无法在include目录中找到qconfig.cpp文件,这样就导致了qmake的生成失败。这回我抓虾了。

 

   在网络上翻找了很多地方,都没法找到qconfig.cpp文件的一点儿信息,只是一些Linux上的qconfig配置出错的问题,因为windows版本和Linux下的Qt配置方法不同,这些信息对我来说几乎没有什么用处。国外站点上也有如何生成Qt static库的文章,但和我之前的做法没有什么两样,不过,人家的写的更加细致专业。 不过一个信息对我很有帮助,在Qt的2007年的邮件系统列表中,曾经有人问过官方类似的问题,说在编译的时候,qconfig.cpp文件找不到。官方的回应是:那是通过configure.exe生成的。啊,这个很重要。

 

   于是,我想到了Qt SDK中的编译工具源代码,按照LGPL的传统,工具的源代码也是公开的。于是找到了configure.exe这个工具的源代码目录

 

   $(QtDIR)/tools/configure/

   找到了main.cpp文件,里面是...这样的....

  

   其中,在函数

     

   中,下面的代码是用来生成我千呼万唤都使不出来的qconfig.cpp文件的。

    

   于是乎,我就找到了generateConfigfiles()函数的定义,找到了生成qconfig.cpp文件的代码段,代码的写法上没有任何问题。只是莫名其妙,为什么无法生成qconfig.cpp文件呢? 在这个函数中,先通过建立一个临时文件对象QTemporaryFile,并建立一个文件输出流与之绑定,通过文件输出流输出文本信息之后,将QTemporaryFile对象所对应的文件替换原来的文件。这样操作就完成了。可是非常奇怪的是,同样的函数代码中,也有不使用这种方式来生成文件的。比如生成qmake.conf这个文件的时候,就没有用到QTemporaryFile这个方法

    

   很明显,在我这里,qmake.conf文件生成正常。难道.......我有一种想骂娘的感觉。于是为了验证我的想法,我在生成qconfig.cpp文件的地方,加入了一些控制台输出语句。结果发现QTemporaryFile::Open()操作失败,并且无法进入相应的程序段。

    

   如上面的代码所示,tmpFile2.open()始终是返回错误,因此,qconfig.cpp也就甭想出来了。

   在网络上,我查到了这样的信息 

   实际应用中有时可能需要使用临时文件,Qt中提供QTemporaryFile类来提供临时文件。QTemporayFile可以安全地创建一个第一无二的临时文件。临时文件通过open()来创建。Qt可以保证临时文件不会重复。在临时文件对象销毁后,将自动删除该临时文件。临时文件通过close()关闭后还可以打开,只要临时文件对象还没有销毁,临时文件就一直存在并由QTemporaryFile内部保持打开。系统的临时目录可以通过QDir::tempPath()来获取,unix/linux系统上的临时目录通常时/temp在windows上通常是TEM/TMP指定

    QTemporaryFile::Open()在临时文件夹中创建一个独一无二命名的文件,然后输出文件,并在最后被销毁。既然open()方法返回的是false,那么可以猜测一下,这是由于我的windows系统导致的。时间来不及了,所以,我就不去深究这样的问题了。同时,也有可能是我安装的某某系统安全监控软件的导致的,它阻止了临时文件的生成及其一切操作。

 

    我们就事论事,在这里,我只好修改了configure.exe这个工具的源代码,将QTemporaryFile替换成QFile,直接指明路径,文件名和操作方法,生成,输出,关闭。 正如上面的原始代码,被修改成了

     

   在configure目录下,分别运行qmake, nmake命令生成qmake命令文件。

   回到Qt SDK的根目录下,继续运行configure命令,对Qt进行配置。一切正常。qconfig.cpp文件生成正常。编译正常。 汗.......

 

   

 

总结:

      我想,Qt项目组之所以用QTemporaryFile文件来生成配置文件,是为了万一在生成新的配置文件的时候,出现异常情况,导致生成配置文件失败,同时又破坏了原有文件。因此使用QTemporaryFile类来实现这样的功能,反正临时文件被破坏掉也不会有大的问题,但是当QTemporaryFile类操作失败的时候,却一点儿信息都没有提示,这的确不合适。或许,创建临时文件的时候应该更加强势一些,哈哈哈,这些都是我个人的臆想。

    同时,在遇到这个编译失败的问题的时候,我还下载了所有版本的Qt SDK,各个版本之间分析。总算找到了其他版本的qconfig.cpp文件,并且用了替换的办法也没有用,即便是修改了qconfig.cpp里面的配置信息以适应现有的平台,但还是编译qt库失败。唉,郁闷,整折腾了我两天的睡觉时间。郁闷。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值