青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Error

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

#實際上是調用cmake安裝目錄\share\cmake-2.8\Modules\FindQt4.cmake
#設置好一批預定義的東東
FIND_PACKAGE(Qt4 REQUIRED)

# 不解釋
SET(helloworld_SOURCES main.cpp hellowindow.cpp)
SET(helloworld_HEADERS hellowindow.h)

#處理helloworld_HEADERS中的MOC宏,處理結果生成在helloworld_HEADERS_MOC
QT4_WRAP_CPP(helloworld_HEADERS_MOC ${helloworld_HEADERS})

#添加QT頭文件和宏
INCLUDE(${QT_USE_FILE})
ADD_DEFINITIONS(${QT_DEFINITIONS})






**********************************************

Using CMake to Build Qt Projects

Written by: Johan Thelin

Qt comes with the QMake tool for handling cross platform building issues. However, there are other build systems available such as autotools, SCons and CMake. These tools meet different criterias, for example external dependencies.

When the KDE project shifted from Qt 3 to Qt 4 the project changed build tool from autotools to CMake. This has given CMake a special position in the Qt world &emdash; both from the number of users point and from a feature support and quality point. Seen from a workflow point of view, Qt Creator supports CMake since version 1.1 (1.3 if you want to use a Microsoft toolchain).

A Basic Example

In this article we will focus on CMake itself, and how to use it in conjunction with Qt. To do this, let's start with an overview of a simple, but typical CMake-based project. As you can tell from the listing below, the project consists of some source files and a text file.

$ ls CMakeLists.txt hellowindow.cpp hellowindow.h main.cpp 

Basically, the CMakeLists.txt file replaces the projectfile used by QMake. To build the project, create a build directory and run cmake and then make from there. The reason for creating a build directory is that CMake has been built with out-of-source building in mind from the very start. It is possible to configure QMake to place intermediate files outside the source, but it requires extra steps. With CMake, it is the default.

$ mkdir build $ cd build $ cmake .. && make 


CMake building a basic project.

The argument given to CMake refers to the directory where the CMakeLists.txt file resides. This file controls the whole build process. In order to fully understand it, it is important to recognize how the build process looks. The figure below shows how the user files: sources, headers, forms and resource files are processed by the various Qt code generators before joining the standard C++ compilation flow. Since QMake was designed to handle this flow, it hides all the details of this flow.


The Qt build system.

When using CMake, the intermediate steps must be handled explicitly. This means that headers with Q_OBJECT macros must be run through moc, user interface forms must be processed by uic and resource files must pass through rcc.

In the example that we started with the world is slightly easier, though. It is limited to a single header file that needs to meet moc. But first, the CMakeLists.txt defines a project name and includes the Qt4 package as a required component.

PROJECT(helloworld) FIND_PACKAGE(Qt4 REQUIRED) 

Then all sources involved in the build process are assigned to two variables. The SET command assigns the variable listed first with the values that follow. The names, helloworld_SOURCES and helloworld_HEADERS, is by convention. You can name them either way you like.

SET(helloworld_SOURCES main.cpp hellowindow.cpp) SET(helloworld_HEADERS hellowindow.h) 

Notice that the headers only include the headers that needs to be processed by moc. All other headers can be left out of the CMakeLists.txt file. This also implicates that if you add a Q_OBJECT macro to any of your classes you must ensure that it is listed here.

To invoke moc, the macro QT4_WRAP_CPP is used. It assigns the names of the resulting files to the variable listed first. In this case the line looks as follows.

QT4_WRAP_CPP(helloworld_HEADERS_MOC ${helloworld_HEADERS}) 

What happens is that all headers are processed by moc and the names of the resulting source files are listed in the helloworld_HEADERS_MOC variable. Again, the variable name is by convention rather than forced.

In order to build a Qt application, the Qt include directories needs to be added as well as a range of defines need to be set. This is handled through the commands INCLUDE and ADD_DEFINITIONS.

INCLUDE(${QT_USE_FILE}) ADD_DEFINITIONS(${QT_DEFINITIONS}) 

Finally, CMake needs to know the name of the resulting executable and what to link it to. This is conveniently handled by by the commands ADD_EXECUTABLE and TARGET_LINK_LIBRARIES. Now CMake knows what to build, from what and through which steps.

ADD_EXECUTABLE(helloworld ${helloworld_SOURCES}      ${helloworld_HEADERS_MOC}) TARGET_LINK_LIBRARIES(helloworld ${QT_LIBRARIES}) 

When reviewing the listing above, it relies on a number of variables starting with QT_. These are generated by the Qt4 package. However, as a developer, you must explicitly refer to them as CMake is not build as tightly to suite Qt as QMake.

Adding More Qt

Moving beyond the initial example, we now look at a project with both resources and user interface forms. The resulting application will look quite similar to its predecessor, but all the magic takes place under the hood.

The CMakeLists.txt file start by naming the project and including the Qt4 package - the complete file can be downloaded as a source code package accompanying this article. Then all the input files are listed and assigned to their corresponding variables.

SET(helloworld_SOURCES main.cpp hellowindow.cpp) SET(helloworld_HEADERS hellowindow.h) SET(helloworld_FORMS hellowindow.ui) SET(helloworld_RESOURCES images.qrc) 

The new file types are then handled by QT4_WRAP_UI and QT4_ADD_RESOURCES. These macros operate in the same ways as QT4_WRAP_CPP. This means that the resulting files are assigned to variable given as the left-most argument. Notice that the header files generated by uic are needed as we need to build a dependency relationship between them and the final executable. Otherwise they will not be created.

QT4_WRAP_CPP(helloworld_HEADERS_MOC ${helloworld_HEADERS}) QT4_WRAP_UI(helloworld_FORMS_HEADERS ${helloworld_FORMS}) QT4_ADD_RESOURCES(helloworld_RESOURCES_RCC ${helloworld_RESOURCES}) 

All the resulting files are then added as dependencies to the ADD_EXECUTABLE macro. This includes the uic generated headerfiles. This establishes the dependency from the executable to the hellowindow.ui file through the intermediary ui_hellowindow.h header.

ADD_EXECUTABLE(helloworld ${helloworld_SOURCES}      ${helloworld_HEADERS_MOC}      ${helloworld_FORMS_HEADERS}      ${helloworld_RESOURCES_RCC}) 

Before this file can be used to build the project there is a small caveat to handle. As all intermediate files are generated outside the source tree, the header file generated by uic will not be located by the compiler. In order to handle this, the build directory needs to be added to the list of include directories.

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) 

With this line, all intermediary files will be available in the include path.

Qt Modules

Until now we have relied on the QtCore and QtGui modules. To be able to use more modules, the CMake environment must be tuned to enable them. By setting them to TRUE using the SET command, the included modules can be controlled.

For instance, to enable OpenGL support add the following line to your CMakeLists.txt.

SET(QT_USE_QTOPENGL TRUE) 

The most commonly used modules are controlled using the following variables.

  • QT_USE_QTNETWORK
  • QT_USE_QTOPENGL
  • QT_USE_QTSQL
  • QT_USE_QTXML
  • QT_USE_QTSVG
  • QT_USE_QTTEST
  • QT_USE_QTDBUS
  • QT_USE_QTSCRIPT
  • QT_USE_QTWEBKIT
  • QT_USE_QTXMLPATTERNS
  • QT_USE_PHONON

In addition to these, the variable QT_DONT_USE_QTGUI can be used to disable the use to QtGui. There is a similar variable to disable QtCore, but that is more to be feature complete than to actually add much useful value.

Added Value and Complexity

It is not as trivial to use CMake as QMake, but the rewards are more features. The most notable point when moving from QMake is CMake's built in support for out-of-source builds. It can really change habits, and thus make versioning code much easier.

It is also possible to add conditionals for various platforms and build scenarios. For instance, use different libraries for different platforms, as well as tuning the same project differently for different situations.

Other powerful features are the ability to generate multiple executables and libraries in one build as well as using said executables and libraries in the same build. This, in combination with the QtTest module can handle complex build situations from a single configuration.

The choice between CMake and QMake is really quite easy. For straight forward Qt projects, QMake is the obvious choice. When the build requirements passes the complexity threshold for QMake, CMake can take its place. With Qt Creator's support for CMake, the same tools can still be used.

posted on 2012-07-16 12:24 Enic 閱讀(2693) 評論(0)  編輯 收藏 引用 所屬分類: QT
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美视频在线观看| 久久久人成影片一区二区三区| 欧美成人激情视频免费观看| 欧美一区二区免费| 国内精品久久久久久久影视麻豆| 久久精品国产综合精品| 欧美主播一区二区三区美女 久久精品人 | 亚洲一区欧美| 亚洲欧美日本国产专区一区| 国产日韩一区| 欧美电影电视剧在线观看| 欧美国产成人在线| 亚洲愉拍自拍另类高清精品| 亚洲欧洲av一区二区| 在线视频国内自拍亚洲视频| 亚洲福利免费| 欧美日韩在线观看视频| 久久激情网站| 欧美激情 亚洲a∨综合| 午夜影院日韩| 美女国产精品| 亚洲欧美日韩电影| 久久久久久一区| 亚洲视频在线观看三级| 欧美在线一二三区| 在线视频中文亚洲| 欧美在线观看www| 亚洲最新中文字幕| 久久精品伊人| 中国成人在线视频| 久久嫩草精品久久久精品| 日韩午夜精品| 久久精品人人做人人爽电影蜜月| 日韩亚洲欧美一区| 久久精品亚洲精品| 亚洲欧美精品中文字幕在线| 美女视频黄 久久| 久久av在线看| 欧美体内she精视频在线观看| 美女脱光内衣内裤视频久久影院| 欧美视频官网| 欧美freesex8一10精品| 国产亚洲激情| 亚洲一区免费| 国产精品99久久久久久久vr| 美女免费视频一区| 欧美一区午夜视频在线观看| 欧美日韩一区不卡| 亚洲高清视频在线观看| 伊伊综合在线| 欧美一区二区三区啪啪| 亚洲免费在线看| 欧美揉bbbbb揉bbbbb| 91久久国产自产拍夜夜嗨| 影音先锋亚洲电影| 欧美中在线观看| 久久精品99国产精品日本| 国产精品久久久久77777| 亚洲伦理在线| 一本不卡影院| 欧美日韩国产影院| 最新亚洲电影| aa亚洲婷婷| 欧美区视频在线观看| 亚洲国产精品一区二区第一页 | 国产精品国产三级国产专播品爱网 | 久久精品99| 国产午夜精品美女毛片视频| 亚洲欧洲av一区二区| 先锋影音久久久| 国产欧美91| 欧美一区二区日韩| 久久久视频精品| 黄色成人91| 欧美大片免费观看| 欧美高清视频一区二区三区在线观看| 极品少妇一区二区三区| 久久九九精品| 亚洲大黄网站| 国产精品99久久久久久www| 国产精品成人播放| 亚洲欧美日韩综合一区| 久久久亚洲一区| 亚洲激情网站| 欧美日韩一区高清| 亚洲欧美伊人| 欧美成人精品激情在线观看 | 国产精品国产三级国产普通话99 | 欧美成人情趣视频| 亚洲精品永久免费| 国产精品va在线| 欧美中文字幕| 亚洲福利视频网站| 亚洲伊人伊色伊影伊综合网| 国产欧美在线播放| 乱码第一页成人| 夜夜爽av福利精品导航| 久久精品一区二区| 亚洲精品中文字幕在线| 国产精品高潮呻吟久久| 久久国产主播精品| 91久久精品国产91性色tv| 欧美亚洲网站| 亚洲精品久久久蜜桃| 国产美女搞久久| 欧美va天堂| 亚洲欧美大片| 亚洲国产欧美精品| 久久久久国产一区二区三区| 亚洲精品在线观| 国产亚洲欧美日韩美女| 欧美乱在线观看| 久久久久女教师免费一区| 国产精品99久久久久久有的能看| 免播放器亚洲| 欧美一级久久久| 夜夜嗨av一区二区三区| 国产专区综合网| 国产精品国产三级国产专区53 | 欧美日韩中文在线| 久热精品视频在线观看| 亚洲制服少妇| 99国产精品自拍| 嫩草成人www欧美| 久久精品欧洲| 亚洲欧美日本伦理| 中文成人激情娱乐网| 亚洲激情二区| 在线日韩精品视频| 国产一区二区日韩| 国产欧美一区二区三区国产幕精品 | 久久久国产午夜精品| 亚洲欧美国产va在线影院| 亚洲伦理在线观看| 亚洲欧洲一区二区在线播放| 欧美~级网站不卡| 久久欧美中文字幕| 久久久精品欧美丰满| 亚洲欧美日韩国产综合在线| 一区二区三区毛片| 99这里只有精品| 99视频在线精品国自产拍免费观看| 亚洲国产精品精华液2区45| 在线成人免费视频| 怡红院精品视频| 在线观看不卡av| 136国产福利精品导航网址应用 | 免费在线看成人av| 老色鬼久久亚洲一区二区| 久久综合一区二区| 久久婷婷国产麻豆91天堂| 久久久精品性| 久久字幕精品一区| 欧美国产在线电影| 欧美伦理视频网站| 欧美午夜大胆人体| 国产精品视频xxx| 国产伪娘ts一区| 亚洲国产精品一区二区www| 亚洲高清在线观看| 99视频一区二区| 亚洲欧美久久久| 欧美在线二区| 免费视频一区| 欧美激情bt| 亚洲视频在线观看免费| 亚洲一区二区少妇| 久久精品人人做人人爽| 免费欧美日韩| 国产精品福利网| 国产在线观看精品一区二区三区| 亚洲国产高清视频| 一区二区国产日产| 久久精品av麻豆的观看方式| 欧美成人一区在线| 在线亚洲欧美| 久久―日本道色综合久久| 欧美激情四色| 国产日本欧美在线观看| 亚洲人成人一区二区在线观看| 亚洲私人影院在线观看| 久久久久国产精品www| 91久久夜色精品国产九色| 亚洲主播在线| 欧美电影在线观看| 国产伦理一区| 99国产精品| 久久亚洲精选| 亚洲视频一区在线| 猫咪成人在线观看| 国产欧美一区二区精品秋霞影院| 亚洲精品网址在线观看| 欧美专区日韩视频| 亚洲精品免费在线播放| 久久久www成人免费毛片麻豆| 欧美视频二区| 亚洲美女色禁图| 美女久久网站| 性欧美超级视频| 欧美性淫爽ww久久久久无|