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

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>
            国产精品实拍| 免费亚洲电影在线观看| 国产精品国产三级国产aⅴ入口| 亚洲国产毛片完整版| 欧美国产大片| 欧美大片一区| 亚洲一区二区精品| 亚洲欧美日韩国产一区| 精品999日本| 亚洲日本成人女熟在线观看| 欧美激情视频一区二区三区在线播放 | 亚洲视频第一页| 在线亚洲电影| 国产一区二区日韩精品| 模特精品裸拍一区| 欧美日韩成人精品| 欧美亚洲一区二区三区| 另类国产ts人妖高潮视频| 日韩视频一区| 午夜亚洲影视| 亚洲精品乱码久久久久| 亚洲一品av免费观看| 国外精品视频| 99视频热这里只有精品免费| 国产亚洲一区在线| 亚洲日本中文字幕| 国内精品视频久久| 亚洲精选在线| 一区二区亚洲| 亚洲午夜在线视频| 亚洲国产aⅴ天堂久久| 亚洲天堂av综合网| 亚洲人成网站在线播| 亚洲欧美国内爽妇网| 99精品欧美一区二区三区| 午夜老司机精品| 夜夜精品视频| 久热re这里精品视频在线6| 亚洲免费视频网站| 欧美精品免费视频| 六月天综合网| 国产精品入口66mio| 亚洲欧洲美洲综合色网| 黄色一区二区在线| 亚洲一级在线| 亚洲图片在区色| 欧美高清一区| 欧美h视频在线| 黄色一区二区在线| 久久成人精品一区二区三区| 亚洲午夜精品久久久久久浪潮| 久久视频精品在线| 久久看片网站| 国产色产综合产在线视频| 日韩一级成人av| 日韩一级不卡| 欧美韩日一区| 亚洲国产精品黑人久久久 | 久久久噜噜噜久久狠狠50岁| 午夜精品久久久久久99热软件| 欧美伦理影院| 亚洲激情在线| 夜久久久久久| 欧美日韩国产三区| 亚洲美女视频| 亚洲视频在线观看视频| 欧美日本二区| 在线亚洲一区二区| 亚洲尤物视频网| 国产精品女人毛片| 亚洲综合色网站| 久久久久五月天| 一色屋精品视频在线看| 久久久久国产精品午夜一区| 快播亚洲色图| 亚洲精品久久久久久久久久久久| 美女主播一区| 亚洲精品少妇网址| 亚洲一区三区在线观看| 国产精品久久久久久久午夜片| 亚洲欧美激情精品一区二区| 久久国产精品久久久久久| 国语自产精品视频在线看8查询8| 久久成人免费视频| 亚洲电影第1页| 亚洲视频在线一区观看| 国产农村妇女毛片精品久久莱园子 | 亚洲激情国产| 欧美天堂在线观看| 欧美一区二区三区视频在线观看| 久久久亚洲国产美女国产盗摄| 亚洲国产综合在线看不卡| 欧美国产精品中文字幕| 亚洲视频在线一区| 久色婷婷小香蕉久久| 亚洲伦理中文字幕| 国产精品三级视频| 久久这里有精品15一区二区三区| 亚洲欧洲一区二区在线播放| 亚洲永久精品国产| 亚洲国产精品激情在线观看| 国产精品chinese| 久久九九有精品国产23| 日韩午夜在线视频| 久久久午夜电影| 亚洲调教视频在线观看| 欲香欲色天天天综合和网| 欧美日韩不卡视频| 久久久久成人精品| 亚洲丝袜av一区| 欧美韩日一区| 久久精品一区二区三区不卡| 99综合视频| 影音先锋亚洲一区| 国产精品久久久久久久免费软件| 免费视频一区| 欧美在线一区二区| 一区二区三区日韩| 亚洲黑丝在线| 欧美成人一区二区| 久久久精品性| 亚洲欧美三级伦理| 在线综合亚洲| 亚洲人成7777| 亚洲二区在线| 国产一区二区三区在线观看免费 | 亚洲国产精品久久久久婷婷884| 国产精品一区二区欧美| 欧美精品在线免费观看| 久久最新视频| 久久亚洲欧美| 久久九九久久九九| 欧美一区二区三区视频免费播放 | 久久精品人人做人人爽| 亚洲资源av| 亚洲一区观看| 亚洲一区欧美激情| 亚洲一区二区三区视频| 一本一本a久久| 一区二区高清视频在线观看| 日韩网站免费观看| 亚洲乱亚洲高清| 亚洲全黄一级网站| 亚洲精品在线三区| 亚洲乱码精品一二三四区日韩在线 | 日韩午夜一区| 99精品国产99久久久久久福利| 亚洲人成网在线播放| 亚洲精品午夜精品| 一区二区三区福利| 亚洲一区一卡| 篠田优中文在线播放第一区| 羞羞视频在线观看欧美| 午夜一级在线看亚洲| 欧美一区二区免费视频| 久久久久久91香蕉国产| 久久久久久9999| 免费成人网www| 亚洲第一视频| 一区二区不卡在线视频 午夜欧美不卡在 | 在线播放亚洲| 亚洲国产精品毛片| av成人黄色| 香蕉国产精品偷在线观看不卡| 欧美一区二区视频在线观看2020| 久久精品30| 欧美高清成人| 一本色道久久99精品综合| 亚洲欧美激情视频| 久久一区二区三区四区五区| 欧美激情一区二区三区四区 | 久久九九国产| 欧美日韩午夜在线| 国产亚洲福利| 亚洲激情在线观看视频免费| 一区二区欧美亚洲| 久久精品一区二区三区四区| 免费成人高清视频| 99视频精品在线| 久久国产乱子精品免费女 | 午夜欧美不卡精品aaaaa| 久久久久五月天| 国产精品成人久久久久| 一区在线观看视频| 亚洲综合视频一区| 欧美高清在线播放| 亚洲在线一区二区三区| 美女国内精品自产拍在线播放| 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 免费看精品久久片| 亚洲午夜精品一区二区| 蜜臀久久99精品久久久久久9| 国产精品成人播放| 亚洲美女中出| 久久婷婷影院| 亚洲欧美国产另类| 欧美久久婷婷综合色| 在线免费不卡视频| 欧美一区二区三区视频免费| 亚洲精选成人|