我正在为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中定义1}}创建一个新的宏,比如QT4_WRAP_CPP
。 em>),这将采用额外的前缀参数,并将此前缀添加到生成的moc文件。这样,我会拨打QT4_WRAP_CPP_WITH_PREFIX
两次,一次用于 .h 文件,一次用于 .cpp 文件,用不同的前缀。我只是不喜欢这种方法,我会搞乱CMake Qt支持的内部,而不是使用公共API。
有更好的主意吗?
Cheerz,Franz
答案 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文件并按照诺基亚文档的建议应用构建规则。