6

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

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

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

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

我认为问题在于,对于给定的一对文件foo.hfoo.cppQT4_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,基于QT4_WRAP_CPP(在share/cmake-2.8/Modules/Qt4Macros.cmake中定义),它将采用一个额外的前缀参数并将这个前缀添加到生成的 moc文件。这样,我会调用QT4_WRAP_CPP_WITH_PREFIX两次,一次用于.h文件,一次用于.cpp文件,具有不同的前缀。我只是不喜欢这种方法,因为我会弄乱 CMake 的 Qt 支持的内部结构,而不是使用公共 API。

有更好的主意吗?

欢呼,弗朗茨

4

2 回答 2

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 文件的名称匹配)。

于 2012-10-30T12:19:16.463 回答
1

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

于 2010-12-01T10:19:28.600 回答