• 做一个幸福的人,读书,旅行,努力工作,关心身体和心情。
  • 不管有没有人爱,也要努力做一个可爱的人。不埋怨谁,不嘲笑谁,也不羡慕谁,阳光下灿烂,风雨中奔跑,做自己的梦,走自己的路。

使用QtCreator遇到的编译错误

C/C++ lcq 3年前 (2015-05-19) 810次浏览 1个评论

记录一下最近使用QtCreator开发中遇到的一些编译问题,供以后自己查阅。


编译错误:converting to execution character set:Illegal byte sequence

问题描述:本来这个文件在Visual Studio 2013里面开发的,迁移到QtCreator之后发生了这个问题。因为Visual Studio 2013默认是使用GB2312编码的,而QtCreator使用的是UTF-8。所以发生了上述问题。

解决办法:将GB2312的编码文件使用NotePad++转为UTF-8(无BOM格式的文档即可)


编译错误:error: C1083: 无法打开包括文件: “QSqlError”: No such file or directory

问题描述:我想测试Qt操作数据库的一些操作,无奈我使用#include<QSqlError>包含任何关于数据库的头文件,均报以上错误。网上百度到的全部都是在pro文件里面加上 QT += sql尼玛我一开始就加上了好么。网上也有人跟我遇到了类似的问题(链接)。反正这个问题我也是折腾了很久,虽然后面解决了,但是我也不知道问题出在哪里。

解决办法:百度了N久之后在Stack Overflow上面找到了答案(链接)。为了以防链接出问题,我将别人的解决办法摘抄过来了:“right click on the project/solution name and click the Run qmake option, rebuild and run the application. It works just fine.”唉,确实很多编程方面的问题,百度特别不靠谱啊。简单的翻译一下是:在解决方案上面右键,点击“执行qmake”,再点击“rebuild”按钮。重新编译即可。按照这个方法果然解决了问题。只是,我也不知道为什么这样就可以了,求高手解答。


运行错误:qt 无法定位程序输入点****于动态链接库****上。

问题描述:我之前装了一个带有msvc2013_opengl Qt的版本,后来由于某种原因,又装了一个mingw491_32的Qt版本。当编译之后的exe我点运行的时候弹出如下的错误提示框。我将Qt的路径加入到了环境变量里面,可还是出现此问题呢。后面再一篇博文里面找到了原因。因为之前装msvc2013_opengl版本的时候,我设置了一下环境变量,然后我又新增加了一个环境变量,但是新增加的环境变量在我之前的后面,前面的把后面的覆盖了,所以新加的环境变量不起作用。我将新加的环境变量值挪到前面去,立马就解决问题了。

解决办法:在path里面增加环境变量,如果还不行,将环境变量加到最前面。


运行错误:error: no matching function for call to 'QtSqlLiteTest::connect(QSqlTableModel*&, void (QSqlTableModel::*)(int), QtSqlLiteTest*, QtSqlLiteTest::QtSqlLiteTest(QWidget*)::<lambda(int)>)' });

问题描述:我在Qt5.0上,写了一个Lambda的信号槽,编译出现上述问题。代码如下所示:

刚开始我还以为我使用Lambda的语法错了。将Lambda的表达式换成槽就正常了。后面我想起只有C++ 11才有Lambda语法。于是在.pro文件下面加了一句:CONFIG += c++11就可以正常运行了。

解决办法:Qt5.0以上在pro文件里面增加一行CONFIG += c++11,Qt5.0以下,在pro文件里面增加一行gcc:CXXFLAGS += -std=c++0x(未测试)。参考文章:链接1链接2


编译错误:undefined reference to `MyData::m_book'。

问题描述:我在类里面定义了static变量m_book,却没有初始化。

解决办法:初始化类里面的static变量即可。


编译错误:error: 'QObject' is an inaccessible base of 'MyData' type, types, &SignalType::Object::staticMetaObject);

问题描述:私有继承QObject。如:class MyData : QObject

解决办法:改为公有继承QObject即可。即:class MyData : public QObject


编译错误:error: could not convert 'QString(((const char*)""))' from 'QString' to 'QString&'

问题描述:我在一个类里面,写了一个函数,传进来的参数为引用值,但是我希望如果没有传引用值,这个函数有个默认值,函数声明如下:

void print(QString &msg = QString("Hello World"));

函数的实现如下:

结果引发了上述的错误。

但是很奇怪的是,在VIsual Studio 2013中编译却是正常的。在QtCreator(MinGW)中编译却不正常。当然,后面想想我这种写法肯定是错误的。怎么说呢,错误的根源在于我错误的意图吧。因为引用是一个别名,但我却想要对一个常量进行非常量的引用。至于Visual Studio 2013中能够编译,我猜想是Visual Studio为我的每个常量自动分配了一个变量,然后将这个变量给了我这个引用。

想清楚这个问题了,遵循引用必须要引用一个变量。可以声明一个全局变量,然后传递给引用作为默认值。比如QString g_msg = "Hello World"; 然后将函数声明改为:void print(QString &msg = g_msg);即可。在QtCreator中编译就通过了。

参考链接。这个链接中也说明了这个问题,复制过来“不能将实际值传递给引用类型的参数。可以将变量作引用类型参数的默认值,这时变量必须是已经声明且是全局变量。”


乐趣公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明使用QtCreator遇到的编译错误
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址