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