Visual studio cpp文件中的Qt、CMake、Visual Studio和Q_对象

Visual studio cpp文件中的Qt、CMake、Visual Studio和Q_对象,visual-studio,qt,cmake,qobject,Visual Studio,Qt,Cmake,Qobject,我正在使用Qt4.6、CMake 2.8和VisualStudio2008为Windows平台开发一个大型项目 就构建系统而言,它都是标准的:我使用CMake的QT4\u WRAP\u CPP宏从头文件生成moc文件,然后在add\u executable命令中将头文件链接到最终可执行文件。一切正常 此设置的唯一限制是,我无法使用.cpp文件中的Q_对象定义小部件或助手。这对于小的、特定于上下文的helpers类来说是非常方便的,这些类应该出现在使用它们的地方的旁边 我试图将整个源文件列表(包括

我正在使用Qt4.6、CMake 2.8和VisualStudio2008为Windows平台开发一个大型项目

就构建系统而言,它都是标准的:我使用CMake的
QT4\u WRAP\u CPP
宏从头文件生成moc文件,然后在
add\u executable
命令中将头文件链接到最终可执行文件。一切正常

此设置的唯一限制是,我无法使用.cpp文件中的
Q_对象
定义小部件或助手。这对于小的、特定于上下文的helpers类来说是非常方便的,这些类应该出现在使用它们的地方的旁边

我试图将整个源文件列表(包括.h和.cpp)传递到
QT4\u WRAP\u cpp
,而不仅仅是头文件,但这不起作用(链接失败,因为一些与moc相关的符号未定义)

我认为问题在于,对于给定的foo.h和foo.cpp文件对,
QT4\u WRAP\u cpp
宏将在同一目录中生成相同的moc文件(moc\u foo.cxx),显然这意味着第一个文件将被第二个文件覆盖,因此在链接时符号将丢失

有没有办法解决这个问题?例如,我尝试为表单的foo.cpp添加特定规则

QT4_GENERATE_MOC(directory/foo.cpp directory/foo.moc)
然后加上

#include "foo.moc"
在foo.cpp的末尾。我认为这应该是可行的,但遗憾的是,VisualStudio只允许每个文件有一个构建规则,而且.cpp文件已经有一个构建规则(编译到对象文件),所以这种方法不起作用,至少在VisualStudio中是这样

我的另一个想法是基于
QT4_WRAP_CPP
(在share/cmake-2.8/Modules/Qt4Macros.cmake中定义)创建一个新的宏,比如带有前缀的
QT4_WRAP_CPP_
,该宏将使用额外的前缀参数,并将该前缀添加到生成的moc文件中。这样,我将使用前缀调用
QT4\u WRAP\u CPP\u两次,一次调用.h文件,一次调用.CPP文件,使用不同的前缀。我只是不喜欢这种方法,因为我会弄乱CMake的Qt支持的内部,而不是使用公共API

还有更好的主意吗


Cheerz,Franz

参考文件“使用主运行中心”(http://doc.qt.nokia.com/4.1/moc.html),您只需要在实现文件的末尾导入“foo.moc”。由于无法相应调整生成规则,请尝试导出.pro文件,并按照诺基亚文档中的建议应用生成规则。

最新版本的CMake具有“automoc”,这对我来说非常有吸引力:

只需在CMakeLists.txt中添加:

set(CMAKE_AUTOMOC TRUE)
然后在cpp(例如example.cpp)文件中:


(*.moc必须与cpp文件的名称匹配)。

我不确定我是否理解这一点:“此设置的唯一限制是,我无法在.cpp文件中使用Q_对象定义小部件或帮助程序。”你不应该在头文件以外的任何文件上运行moc?我发现偶尔在.cpp文件中定义一个小帮助程序类很方便,并且不要将其暴露在此.cpp文件之外。为此,我需要能够在.cpp文件上运行MOC。我在帖子中介绍的
QT4_WRAP_CPP_WITH_PREFIX
宏方法很有魅力。@Françoisbaune-你有没有想出解决办法?即使对于这样简单的事情:#include#include#include class MyClass:public QObject{Q#u OBJECT};int main(int,char*[]){MyClass MyClass;return 0;}我不知道如何移动它,因为它位于cpp文件中(并且在尝试正常构建它时会出现vtable错误)。@DavidDoria我的解决方案可能缺乏优雅性,但它可以工作:我只是移动所有文件(包括.cpp文件)[1],在那些需要移动的cpp文件中,我包括生成的moc文件[2]。[1]: [2]:
#include "example.moc"