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

Error

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

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

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

#處理helloworld_HEADERS中的MOC宏,處理結(jié)果生成在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>
            久久久久一区二区| 先锋a资源在线看亚洲| 另类亚洲自拍| 亚洲成人直播| 欧美成人激情视频| 男人的天堂亚洲在线| 亚洲精品一区二区三区四区高清| 欧美夫妇交换俱乐部在线观看| 久久一综合视频| 日韩写真在线| 亚洲自拍电影| 揄拍成人国产精品视频| 欧美激情久久久| 欧美天天综合网| 羞羞答答国产精品www一本| 久久超碰97中文字幕| 1024成人网色www| 亚洲精品日韩在线| 国产美女精品| 亚洲电影网站| 国产精品国产三级国产a| 久久精品国产精品| 毛片精品免费在线观看| 中日韩高清电影网| 欧美中文日韩| 中文成人激情娱乐网| 性视频1819p久久| 亚洲人成人一区二区三区| 99精品国产热久久91蜜凸| 国产亚洲福利社区一区| 亚洲欧洲另类国产综合| 国产日韩欧美夫妻视频在线观看| 欧美成人免费视频| 国产精品亚洲综合久久| 亚洲大片精品永久免费| 国产精品日韩一区| 亚洲国产精品悠悠久久琪琪| 国产伦精品一区二区三区在线观看| 女人天堂亚洲aⅴ在线观看| 国产精品成人一区二区三区夜夜夜| 老司机精品视频一区二区三区| 欧美日本免费| 欧美大尺度在线| 国产色视频一区| 一区二区三欧美| 亚洲精品国产无天堂网2021| 欧美中文在线免费| 亚洲愉拍自拍另类高清精品| 免费在线成人av| 久久艳片www.17c.com| 国产精品网红福利| 99伊人成综合| 99精品欧美| 欧美成人精品福利| 你懂的一区二区| 国产又爽又黄的激情精品视频| 亚洲性视频网址| 国产精品99久久久久久久vr | 亚洲一区久久久| 中文国产一区| 欧美日韩另类国产亚洲欧美一级| 亚洲福利视频二区| 影音先锋亚洲一区| 久久久久久自在自线| 久久久久久夜| 黄色免费成人| 久久久精品日韩| 久久亚洲一区二区| 一区二区在线观看视频| 久久久一本精品99久久精品66| 久久精品国产免费看久久精品| 国产乱码精品一区二区三区忘忧草| 一区二区三区**美女毛片| 亚洲神马久久| 国产精品高潮呻吟久久av黑人| 一区二区三区四区五区在线| 亚洲一二三四区| 国产精品视频免费| 香蕉精品999视频一区二区| 久久精品99国产精品日本| 国产欧美二区| 久久精品国产免费| 欧美激情va永久在线播放| 亚洲人成网站影音先锋播放| 欧美久久久久免费| 一本不卡影院| 久久精品视频网| 亚洲国产va精品久久久不卡综合| 久久米奇亚洲| 99视频在线观看一区三区| 亚洲欧美日韩系列| 在线成人中文字幕| 欧美激情中文字幕一区二区| 亚洲天堂av在线免费观看| 欧美一区=区| 亚洲黄色性网站| 国产精品美女久久久| 久久se精品一区二区| 亚洲激情图片小说视频| 午夜精品福利在线观看| **欧美日韩vr在线| 欧美特黄a级高清免费大片a级| 欧美一区影院| 亚洲精选视频在线| 久久视频在线看| 亚洲一级在线观看| 在线高清一区| 国产精品视频久久一区| 免费中文日韩| 亚洲欧美韩国| 亚洲美女av在线播放| 美日韩精品免费| 亚洲欧美日韩在线不卡| 亚洲精品男同| 精品51国产黑色丝袜高跟鞋| 欧美另类99xxxxx| 久久久久久久久久久成人| 亚洲午夜小视频| 亚洲高清成人| 噜噜噜在线观看免费视频日韩| 亚洲视屏一区| 亚洲精品婷婷| 亚洲成色www久久网站| 国产精品一区二区a| 欧美激情精品久久久久久黑人| 久久国产精品久久久| 亚洲伊人久久综合| 一本久道久久综合婷婷鲸鱼| 欧美国产日韩一区二区在线观看 | 亚洲国产天堂久久综合网| 国产日韩欧美中文| 国产精品高潮呻吟| 欧美三级第一页| 欧美韩国在线| 欧美高清hd18日本| 欧美大色视频| 欧美1区2区| 欧美激情中文不卡| 欧美激情国产日韩精品一区18| 久久亚洲精品一区二区| 久久久999精品免费| 欧美一区日韩一区| 午夜视频在线观看一区二区三区| 国产精品99久久99久久久二8 | 久久精品水蜜桃av综合天堂| 亚洲欧美日韩国产另类专区| 亚洲一级黄色片| 午夜免费日韩视频| 亚洲欧美日韩精品久久亚洲区| 亚洲免费婷婷| 欧美亚洲一区三区| 久久久久久久综合日本| 可以看av的网站久久看| 欧美福利一区二区| 亚洲欧洲日本一区二区三区| 最新日韩av| 一本色道久久综合亚洲精品婷婷| 日韩午夜av电影| 国产精品99久久久久久久vr | 久久午夜影视| 欧美福利电影网| 亚洲精品久久久蜜桃| 制服丝袜亚洲播放| 性做久久久久久免费观看欧美| 欧美在线视频观看| 美女国内精品自产拍在线播放| 欧美噜噜久久久xxx| 国产精品分类| 伊人夜夜躁av伊人久久| 日韩亚洲精品在线| 久久都是精品| 欧美成人综合网站| 夜夜嗨av一区二区三区中文字幕| 性欧美大战久久久久久久免费观看 | 亚洲欧美电影院| 老司机精品视频一区二区三区| 欧美激情视频在线播放| 日韩一级在线观看| 久久精品夜色噜噜亚洲aⅴ| 欧美精品导航| 国产一区二区三区高清播放| 亚洲黄网站在线观看| 欧美一级在线播放| 欧美国产日韩在线观看| 亚洲一区二区三区高清不卡| 久久久午夜视频| 国产精品久久久久aaaa| 在线不卡亚洲| 午夜视频一区| 亚洲激情黄色| 久久久成人网| 国产精品亚洲综合天堂夜夜| 91久久国产综合久久蜜月精品| 午夜日韩激情| 亚洲精品在线电影| 久久综合999| 国产综合色精品一区二区三区| 亚洲在线视频免费观看| 欧美黄色网络| 久久中文字幕一区二区三区|