这篇的目的是教你 CMake 如何和 Qt 搅基。
总所周知的是,CMake和Qt自古就搅基搅的很深,CMake自带的find_package脚本其实蛮少,不过其中确绝对会有 Qt 的和KDE的,即使所引用的KDE的cmake脚本其实在KDE Libs里面。
说是介绍,其实主要是介绍一些在QtMacro.cmake里面的宏,cmake的自带脚本都在 /usr/share/cmake-<version>/Modules 下面,可以自行查看。
在开始之前,先来说说Qt的moc。Qt的信号和槽的机制其实大部分是靠代码生成的,Qt自带了一个名为moc的工具,负责解析C++的源文件,并且生成相关的代码。moc是meta object compiler 的缩写,关于moc都干了什么可以自己放狗去搜。
qt4_wrap_cpp(<varname> <header file(s)>)
用来把头文件生成moc文件,并且对应的文件名写到<varname>里面去。
这样你可以在增加target的时候直接使用<varname>和你的cpp文件,这样就可以一起编译了。
当然对于KDE来说,有更方便的automoc,这里按下不表。
Qt DBus
DBus 的接口是通过xml文件指定的,qt也提供了按照DBus的introspect的xml文件直接生成代码的方法,具体来说有两边,一个是adaptor,一个是interface。adaptor是作为实现dbus那一方的,而interface则是调用dbus那一方的。
https://github.com/fcitx/kcm-fcitx/blob/master/src/CMakeLists.txt
例如这里
QT4_ADD_DBUS_INTERFACE(kcm_SRCS org.fcitx.Fcitx.InputMethod.xml org.fcitx.Fcitx.InputMethod )
最后就会生成 org.fcitx.Fcitx.InputMethod.h 这个文件,然后直接include就可以直接使用这个类啦。
类似的adaptor则是相当于注册服务的那一方。
cmake 2.8.6 直接支持 AUTOMOC~~~ –> http://blogs.kde.org/node/4495
那两个叫adaptor和proxy吧。。
支持css继续创作这个系列的文章!
@nihui 谁让有些弱b系统cmake版本那个低哦……