cpp文件中的Qt、CMake、Visual Studio和Q_OBJECT

gorkyyrv  于 2022-12-26  发布在  其他
关注(0)|答案(2)|浏览(200)

我正在使用Qt 4.6、CMake 2.8和Visual Studio 2008为Windows平台开发一个大型项目。
至于构建系统,它都是标准的东西:我使用CMake的QT4_WRAP_CPP宏从头文件生成moc文件,然后在add_executable命令中链接到最终的可执行文件。
这个设置的唯一限制是我不能在 .cpp 文件中使用Q_OBJECT定义小部件或助手,这对于小的、上下文特定的助手类来说非常方便,这些类应该出现在使用它们的地方旁边。
我尝试将源文件的整个列表(包括 .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"

我认为这应该可行,但遗憾的是Visual Studio只允许每个文件有一个构建规则,而 .cpp 文件已经有一个构建规则(编译到目标文件),因此这种方法不可行,至少在Visual Studio中是这样。
我的另一个想法是基于QT4_WRAP_CPP创建一个新宏,比如QT4_WRAP_CPP_WITH_PREFIX(在 share/cmake-2.8/Modules/Qt4Macros.cmake 中定义),它将接受一个额外的前缀参数,并将此前缀添加到生成的moc文件中。这样,我将调用QT4_WRAP_CPP_WITH_PREFIX两次,一次用于 .h 文件,一次用于 .cpp 文件,我不喜欢这种方法的地方在于,我会扰乱CMake的Qt支持的内部,而不是使用公共API。
有更好的主意吗?

gmxoilav

gmxoilav1#

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"

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

8oomwypt

8oomwypt2#

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

相关问题