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

Error

C++博客 首頁 新隨筆 聯系 聚合 管理
  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 閱讀(2675) 評論(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电影| 欧美夜福利tv在线| 亚洲丰满少妇videoshd| 亚洲精品影院| 国产欧美在线播放| 免费在线看成人av| 欧美日本一道本| 久久精品盗摄| 欧美伦理在线观看| 久久久777| 欧美极品影院| 久久大综合网| 欧美精品1区| 久久精品欧美日韩| av不卡在线| 亚洲人成网在线播放| 欧美三级视频在线播放| 久久国产精品高清| 欧美国产精品v| 欧美资源在线观看| 欧美日韩高清一区| 久久精品中文| 欧美日韩视频在线第一区| 久久性天堂网| 欧美日韩视频在线观看一区二区三区| 欧美综合77777色婷婷| 久久国产视频网站| 亚洲综合第一| 欧美精品1区2区| 欧美mv日韩mv国产网站| 国产精品久久久免费| 亚洲国产欧美不卡在线观看| 国产亚洲免费的视频看| 一区二区国产精品| 亚洲精选91| 欧美aa国产视频| 久久综合九色综合欧美就去吻 | 久久综合久久综合这里只有精品| 亚洲欧美激情诱惑| 欧美日韩视频在线一区二区| 免费在线观看精品| 激情五月***国产精品| 午夜精品一区二区三区在线播放| 在线视频你懂得一区二区三区| 久久久无码精品亚洲日韩按摩| 欧美在线视频一区二区| 国产精品大片wwwwww| 亚洲九九爱视频| 欧美一区免费视频| 欧美成人一品| 在线播放豆国产99亚洲| 久久久国产午夜精品| 久久久久久亚洲精品不卡4k岛国| 国产欧美日韩91| 欧美一区二区女人| 欧美尤物巨大精品爽| 国产精品一区二区黑丝| 亚洲色图在线视频| 亚洲欧美久久久久一区二区三区| 欧美视频一区二区三区…| 亚洲美女精品久久| 亚洲永久免费视频| 国产日韩精品入口| 久久国产精品第一页| 欧美a级大片| 亚洲精品自在久久| 欧美午夜免费电影| 亚洲欧美区自拍先锋| 欧美在线亚洲综合一区| 黄色av一区| 美女精品视频一区| 91久久精品国产91性色tv| 一区二区三区高清在线| 国产精品久久久久影院亚瑟| 欧美综合77777色婷婷| 亚洲第一精品电影| 亚洲一区二区三区国产| 国产欧美在线播放| 免费一级欧美在线大片| 欧美高清在线视频| 性欧美8khd高清极品| 欧美成年人视频网站欧美| 日韩一区二区电影网| 欧美午夜无遮挡| 久久精品盗摄| 亚洲精品日本| 久久久久久综合| 一本高清dvd不卡在线观看| 国产精品免费视频xxxx| 蜜臀99久久精品久久久久久软件| 亚洲电影观看| 欧美日韩成人综合天天影院| 午夜精品福利一区二区三区av| 欧美福利在线| 新片速递亚洲合集欧美合集| 亚洲电影视频在线| 国产精品免费网站在线观看| 久久综合久久综合久久综合| 亚洲一区在线观看视频| 亚洲国产精品成人va在线观看| 亚洲欧美日韩国产中文| 国产亚洲一级高清| 欧美日韩视频在线一区二区| 久久综合九色99| 亚洲欧美日韩国产综合在线| 亚洲人成在线播放| 欧美jizz19性欧美| 久久精品亚洲| 午夜在线a亚洲v天堂网2018| 亚洲精选一区| 亚洲国产另类精品专区| 国语自产偷拍精品视频偷| 国产精品成人v| 美女主播视频一区| 午夜精品国产| 亚洲一二三级电影| 亚洲欧洲一区二区三区在线观看 | 久久久亚洲精品一区二区三区 | 午夜精品一区二区三区在线视| 亚洲国产日日夜夜| 一区二区三区我不卡| 国产视频精品免费播放| 国产精品网站在线播放| 国产精品久久久久久亚洲毛片| 欧美日韩成人一区二区| 欧美激情一区二区三区全黄 | 欧美理论电影在线观看| 欧美va天堂在线| 免费h精品视频在线播放| 久久久久国产精品午夜一区| 欧美在线看片| 久久久精品动漫| 久久婷婷成人综合色| 欧美1区2区视频| 欧美国产日韩精品免费观看| 欧美波霸影院| 欧美日韩国语| 国产精品久久久久久av下载红粉| 欧美日韩一级视频| 国产精品第十页| 国产精品视频大全| 国产日韩欧美日韩| 一区二区在线观看视频| 亚洲二区在线| 一本色道久久99精品综合| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久久久国色av免费观看性色| 欧美日韩亚洲综合| 亚洲精品一区在线观看香蕉| 亚洲精选视频免费看| 中文亚洲欧美| 久久爱另类一区二区小说| 久久综合激情| 欧美激情网站在线观看| 亚洲伦伦在线| 欧美一区精品| 欧美激情片在线观看| 国产精品一级二级三级| 精品成人久久| 一本色道久久88精品综合| 亚洲欧美日韩在线不卡| 久久亚洲精品欧美| 欧美阿v一级看视频| 一本综合久久| 久久精品国产视频| 欧美电影在线观看| 欧美精品久久久久久久免费观看| 国产精品美女久久久久av超清 | 一二美女精品欧洲| 欧美资源在线观看| 欧美成人午夜激情视频| 欧美刺激性大交免费视频| 一本久道综合久久精品| 亚洲欧美春色| 欧美不卡高清| 国内精品久久久久伊人av| 日韩午夜电影在线观看| 先锋a资源在线看亚洲| 欧美护士18xxxxhd| 亚洲性图久久| 欧美日本在线看| 国产一区在线观看视频| 亚洲一区二区三区四区视频| 欧美高清自拍一区| 欧美伊人久久大香线蕉综合69| 欧美日韩三区四区| 亚洲理伦在线| 欧美激情第二页|