今天给大家讲解一下Cmake如何编译Qt程序。 
这里说的Qt程序不只是用QtCreator写出来的程序,当然也可以是文本编辑器…。这里说的Qt程序是指,QCoreApplication,QApplication( QMainWindow,QWidget,QDialogue)类型的程序。

CMake是一个跨平台的非常通用的于编译器,用cmake命令可以生产出makefile,在利用make编译程序,这里不多说了,大家比较了解。当然首先得有CMakeLists.txt,我们手动建立一个.txt文件或者利用QtCreator新建一个CMake工程都可以,下面就来看一下,如何写这个CMakeLists,好让Qt程序能编译通过。

  1. 一个CMakeLists.txt的完整示例与分块讲解
  2. 如何添加Qt库
  3. 如何添加 .ui文件与资源文件.qrc

    1. 一个CMakeLists.txt的完整示例与分块讲解

project(project_test)
cmake_minimum_required(VERSION 2.8)
#set(CMAKE_BUILD_TYPE "Release") #using CMAKE_BUILD_TYPE to set the cmake method [Debug | Release]
# CMAKE_CXX_FLAGS CMake C++
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O2 -pthread -fPIE") #-fopenmp add-on multi-thread openmp support

编译时自动打开moc,这个也是一个预编译器,比编译器的预编译还要早,它会把所有类文件中加了Q_OBJECT宏定义的编译成moc_*.cpp,对于自定义信号槽方法,必须加Q_OBJECT,不然会找不到信号槽,而且不会生成moc,完了还得手动moc缺的.cpp文件,然后改头文件。因此打开,并且该加Q_OBJECT就加 …

set(CMAKE_AUTOMOC ON)

#set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) set(CMAKE_INCLUDE_CURRENT_DIR ON)
aux_source_directory(. SRC_LIST)

2 . 如何添加Qt库 
下面的这一段是如何添加Qt的库到程序内,对于Qt5来说,写法与Qt4存在较大差别,不再利用整个包含的原则,而是分模块添加,如下,演示例子用到了5个模块,分别添加进来

# Add in Qt
find_package(Qt5Core)
find_package(Qt5Widgets)
find_package(Qt5Gui)
find_package(Qt5OpenGL)
find_package(Qt5Xml)
# ${QT_INCLUDE_DIRS} ${QT_LIBRARIES} and so on are all Qt4 Macro Definitions!!!!!
include_directories(${Qt5Core_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS} ${Qt5OpenGL_INCLUDE_DIRS} ${Qt5Xml_INCLUDE_DIRS})
#add_definitions(${Qt5Core_DEFINITIONS}) # when cmake version is over 2.8.8, we may use the code below to replace setting CMAKE_CXX_FLAGS
#-----------------------------------
#if(Qt5_POSITION_INDEPENDENT_CODE)
#set(CMAKE_POSITION_INDEPENDENT_CODE ON)
#endif()
#------------------------------------ set(SPEC_OPENCV_LIBS libopencv_features2d.so libopencv_imgproc.so libopencv_calib3d.so libopencv_highgui.so libopencv_core.so libopencv_ml.so)

3 . 如何添加 .ui文件与资源文件.qrc

下面这一段应该算是这个水博的重点了吧… 
利用qt5_wrap_ui可以把.ui文件包裹成一个ui_*.h文件,这里定义到${ui_FILES}变量里,在可执行文件中需要加入目标文件中, 利用qt5_add_resources()命令,添加生成的qrc_*.cpp和其他源文件以及ui_*.h到target内

qt5_wrap_ui(ui_FILES mainwindow.ui)
qt5_add_resources(qrc_FILES drawable.qrc)
add_executable(${PROJECT_NAME} ${SRC_LIST} ${ui_FILES} ${qrc_FILES})

如果按照下面的写法,利用qt5_use_modules(targetname modulesname)命令,则在链接时, 即target_link_libraries时不需要再包含Qt的libraries,替代了下面这种写法:

target_link_libraries(${PROJECT_NAME} ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES} ...)
#${Qt5Core_LIBRARIES} == Qt5::Core 这两种写法是等价的

实际上,对于CMake2.8.8之后的版本,一旦find_package(QtModules)之后,连include_directories()都不需要,直接用qt5_use_modules()命令就行了。

# Use the Widgets module from Qt 5
qt5_use_modules(${PROJECT_NAME} Core Widgets OpenGL Xml Gui) #link libs
target_link_libraries (${PROJECT_NAME} ${SPEC_OPENCV_LIBS})

最后给大家个链接,有问题上去查一查 
http://qt.developpez.com/doc/5.0-snapshot/cmake-manual

http://blog.csdn.net/joshuaxx316/article/details/45576757

CMake编译Qt程序+UI+Resources的更多相关文章

  1. 4、树莓派的中文:安装ftp,安装gcc,安装qt,编译qt程序,运行qt界面程序

    本博文仅作本人操作过程的记录,留作备忘.自强不息 QQ1222698 1.安装FTP:sudo apt-get install vsftpd 2.配置FTP,修改,/etc/vsftpd.conf # ...

  2. 使用命令行编译Qt程序

    code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...

  3. 【Qt】命令行编译Qt程序(nmake)【转】

    简述 前两节讲解了如何在Visual Studio和Qt Creator中搭建Qt开发环境,并分享了我们第一个小程序-Hello World. 下面分享如何使用命令行来编译Qt程序.当然,MSVC和M ...

  4. Linux/Ubuntu下 静态编译Qt程序

    一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的.会提示缺少……库文件之类的错误.这就是动态编译的结果. 但是如果我们想编译一个程序 ...

  5. Linux下静态编译Qt程序

    一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的.会提示缺少……库文件之类的错误.这就是动态编译的结果. 但是如果我们想编译一个程序 ...

  6. cmake 编译windows程序

    cmake 编译windows程序 cmake 编译windows程序 cmake 编译windows程序 尽量使用  尽量使用 尽量使用 https://www.cnblogs.com/liujia ...

  7. linux 下 VSCODE 使用CMake编译STM32程序

    项目在做什么 项目地址 本项目是为了研究MCU在linux下开发而做的 --build 存放cmake编译生成的文件 --cmake 存放cmake编译时会用到的文件,比如工具链检查.编译选项等 -- ...

  8. cmake编译c++程序

    当在Linux系统下编写程序时候,如果没有类似于visual studio.vs code等IDE(集成开发环境)时,如何编译.运行程序呢?一种方法是编写makefile文件,用makefile文件管 ...

  9. vs2013编译qt程序后中文出现乱码

    我的vs是2013版的,qt是5.4.2,在使用vc将程序编译好后并运行时在界面上输出的中文出现了乱码,在网上找了很长时间终于找到了解决方法: QString str = QStringLiteral ...

随机推荐

  1. HashMap工作原理的介绍!

    HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间的区别,那么为何这道面试题如此 ...

  2. VSCode 小鸡汤 第00期 —— 安装和入门

    简介 这将是一个新的系列,将会以 Visual Studio Code(后文都简称为 VSCode 啦)的操作,环境配置,插件介绍为主,为大家不定期的介绍 VSCode 的一些操作技巧,所以取名 VS ...

  3. 使用google自带包实现下拉刷新功能

    android 实现下拉刷新有非常多开源的源代码能够用 比方 :PullToRefreshListView  使用起来也非常方便 如今还能够直接使用google libs以下的 android-sup ...

  4. 【转】mac版微信web开发者工具(小程序开发工具)无法显示二维码 解决方案

    转自:https://www.cnblogs.com/stevenluo/p/6030445.html   微信小程序概念的提出,绝对可以算得上中国IT界惊天动地的一件大事,这可能意味着一场新的开发热 ...

  5. python中string的操作函数

    在python有各种各样的string操作函数.在历史上string类在python中经历了一段轮回的历史.在最开始的时候,python有一个专门的string的module,要使用string的方法 ...

  6. .net reactor 学习系列(一)---.net reactor介绍

    原文:.net reactor 学习系列(一)---.net reactor介绍       学习.net已经一年多了,从语言的编写到框架类库的运用再到.net三大解决方案的了解(WF,WCF,WPF ...

  7. JS-LINQ

    JS中使用LINQ 详细使用方法可找相关资料 文件在这里 引用: <script type="text/javascript" src="@Url.Content( ...

  8. Kubernetes使用集群联邦实现多集群管理

    Kubernetes在1.3版本之后,增加了“集群联邦”Federation的功能.这个功能使企业能够快速有效的.低成本的跨区跨域.甚至在不同的云平台上运行集群.这个功能可以按照地理位置创建一个复制机 ...

  9. NET实现RSA AES DES 字符串 加密解密以及SHA1 MD5加密

    本文列举了    数据加密算法(Data Encryption Algorithm,DEA) 密码学中的高级加密标准(Advanced EncryptionStandard,AES)RSA公钥加密算法 ...

  10. WPF,通过修改dataGrid的cell的style,改变选中行失去焦点时的颜色 4.0可用

    <Style TargetType="{x:Type DataGridCell}"> <Style.Triggers> <Trigger Proper ...