我有一个简单的类,它有一个QT信号,在编译moc生成的代码时给我带来麻烦。我不使用qmake构建系统,但我的scons构建脚本直接调用qt'moc命令。
相关的源文件“write_qstring.h”是:
#ifndef LOG_WRITE_QSTRING_POLICY_H
#define LOG_WRITE_QSTRING_POLICY_H
#include <QObject>
#include <QString>
namespace Log
{
class WriteQString : public QObject
{
Q_OBJECT
public:
signals:
void Changed(QString newString);
};
}
#endif // LOG_WRITE_QSTRING_POLICY_H
我使用以下命令运行moc编译器:
/opt/Qt/5.2.0/gcc_64/bin/moc -DQT_CORE_LIB -I / opt / Qt / 5.2.0 / gcc_64 / include / QtCore -I / opt / Qt / 5.2.0 / gcc_64 / include -o moc_write_qstring.cc write_qstring.h
然后我使用clang ++编译生成的moc_write_qstring.cc:
clang ++ -o moc_write_qstring.o -c -Weverything -pedantic -g -std = c ++ 11 -fcxx-exceptions -pthread -fdiagnostics-fixit-info -fPIC -Wno-c ++ 98-compat -Wno-documentation-unknown-command -Wno-documentation -Wno-padded -Wno-weak-vtables -Wno-exit- time-destructors -Wno-global-constructors -isystem / opt / Qt / 5.2.0 / gcc_64 / include -isystem / opt / Qt / 5.2.0 / gcc_64 / include / QtCore -DQT_CORE_LIB -I / opt / Qt / 5.2。 0 / gcc_64 / include / QtCore moc_write_qstring.cc
这会发出有关未定义行为的警告:
警告:取消引用类型'_t '(又名'无效 (Log :: WriteQString :: *)(QString)')来自类型的reinterpret_cast 'void **'有未定义的行为[-Wundefined-reinterpret-cast] 相关的行是: if(* reinterpret_cast&lt; _t *&gt;(func)== static_cast&lt; _t&gt;(&amp; WriteQString :: Changed)){
由于编译器警告未定义的行为,我只能认为代码被破坏,但为什么metacompiler会发出破坏的代码? 我在这里做错了什么?这是一个c ++ 11问题吗?
clang ++的输出--version
Ubuntu clang版本3.5-1~exp1(trunk)(基于LLVM 3.5)目标: x86_64-pc-linux-gnu线程模型:posix
输出qmake --version
QMake 3.0版在/opt/Qt/5.2.0/gcc_64/lib中使用Qt 5.2.0版