ct文件中的Qt,CMake,Visual Studio和Q_OBJECT

时间:2010-09-06 09:41:23

标签: visual-studio qt cmake qobject

我正在为Windows平台使用Qt 4.6,CMake 2.8和Visual Studio 2008开发一个大型项目。

到构建系统为止,它都是标准的东西:我正在使用CMake的QT4_WRAP_CPP宏从头文件生成moc文件,然后将其链接到add_executable命令中的最终可执行文件。一切都按预期工作。

此设置的唯一限制是我无法使用 .cpp 文件中的Q_OBJECT来定义小部件或帮助程序。对于小型的,特定于上下文的帮助程序类,这将非常方便,它们应该出现在它们使用的位置旁边。

我尝试将整个源文件列表( .h .cpp )传递给QT4_WRAP_CPP,而不仅仅是头文件,但是这不起作用(链接失败,因为一些与moc相关的符号未定义)。

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

有没有办法解决或解决这个问题?例如,我尝试为表单

foo.cpp 添加特定规则
QT4_GENERATE_MOC(directory/foo.cpp directory/foo.moc)

然后添加

#include "foo.moc"
在foo.cpp 的末尾

。我认为这应该有效,但是唉,Visual Studio只允许每个文件有一个构建规则,而 .cpp 文件已经有了构建规则(编译到目标文件),所以这种方法不起作用,至少使用Visual Studio。

我的另一个想法是基于QT4_WRAP_CPP_WITH_PREFIX(在 share / cmake-2.8 / Modules / Qt4Macros.cmake中定义QT4_WRAP_CPP。 em>),这将采用额外的前缀参数,并将此前缀添加到生成的moc文件。这样,我会拨打QT4_WRAP_CPP_WITH_PREFIX两次,一次用于 .h 文件,一次用于 .cpp 文件,用不同的前缀。我只是不喜欢这种方法,我会搞乱CMake Qt支持的内部,而不是使用公共API。

有更好的主意吗?

Cheerz,Franz

2 个答案:

答案 0 :(得分:2)

最新版本的CMake有“automoc”,对我来说就像一个魅力: http://blogs.kde.org/2011/11/01/cool-new-stuff-cmake-286-automoc

只需添加CMakeLists.txt:

set(CMAKE_AUTOMOC TRUE)

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

#include "example.moc"

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

答案 1 :(得分:1)

参考文档“使用MOC”(http://doc.qt.nokia.com/4.1/moc.html),您只需要在实施结束时导入“foo.moc”文件。由于您无法相应地调整构建规则,请尝试导出.pro文件并按照诺基亚文档的建议应用构建规则。