CMake:检测“Q_OBJECT”并将其添加到要由 MOC 处理的文件列表中
目前,我在 CMake 中使用变量 MYPROJECT_CURRENT_HEADERS 来列出所有标头。当我使用 Qt 时,我的 CMakeLists.txt 包含:
QT4_WRAP_CPP(MYPROJECT_CURRENT_MOC ${MYPROJECT_CURRENT_HEADERS})
问题是所有标头都由 moc 处理,即使是那些没有 Q_OBJECT
的标头:因此它会生成许多空文件。
是否有解决方案来“grep”/检测文件是否包含字符串 Q_OBJECT
,如果是这种情况,请将其添加到 MYPROJECT_CURRENT_MOC
吗?
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
即将发布的 CMake 2.8.6 中有一个名为“AUTOMOC”的新目标属性,可以帮助您。
此功能的测试(您可以用作指南或示例)可在此处找到:
http://cmake.org/gitweb?p=cmake.git;a=tree;f=Tests/QtAutomoc;h=7dae3b16a54dc0b2f63bbfa5c218c48b9bbf34a9;hb=nightly-master
非常简单的 CMakeLists。 txt 文件在这里:
http://cmake.org/gitweb?p=cmake.git;a=blob;f=Tests/QtAutomoc/CMakeLists.txt;h=4a5ff1099ba5249a6f22eea745a031b76e6f440f;hb=nightly-master
如果如果您使用此功能,cmake 将扫描 Q_OBJECT 的标头并自动为你运行 moc。
如果您想在 CMake 2.8.6 最终版本发布之前尝试一下,可以在此处下载候选版本之一:
http://cmake.org/files/v2.8/?C=M;O=D
“-rc2”文件确实包含 AUTOMOC 属性。
以下是运行“cmake --help-property AUTOMOC”的帮助文本:
There's a new target property in the soon-to-be-released CMake 2.8.6 called "AUTOMOC" that may help you out.
The test for this feature (which you can use as a guide or example) is found here:
http://cmake.org/gitweb?p=cmake.git;a=tree;f=Tests/QtAutomoc;h=7dae3b16a54dc0b2f63bbfa5c218c48b9bbf34a9;hb=nightly-master
The very simple CMakeLists.txt file is here:
http://cmake.org/gitweb?p=cmake.git;a=blob;f=Tests/QtAutomoc/CMakeLists.txt;h=4a5ff1099ba5249a6f22eea745a031b76e6f440f;hb=nightly-master
If you use this feature, cmake will scan the headers for Q_OBJECT and automatically run moc for you.
If you'd like to try it out before the final release of CMake 2.8.6, you can download one of the release candidates here:
http://cmake.org/files/v2.8/?C=M;O=D
The "-rc2" files do include the AUTOMOC property.
Here's the help text from running "cmake --help-property AUTOMOC":
我不知道从列表中选择具有字符串的标头的简单命令,但您始终可以创建一个循环来查找所有此类标头:
但此解决方案有其自身的缺点:如果您添加
Q_OBJECT
进入过滤掉的文件之一,您需要手动重新运行 cmake。否则,在构建过程中将不会自动生成新文件的 moc 代码。I don't know a simple command to pick headers having a string from the list but you can always make a loop to find all such headers:
But this solution has its own drawback: if you add a
Q_OBJECT
into one of the filtered out files you need to rerun cmake manually. Otherwise moc code for new file will not be automatically generated during the build process.