zoukankan      html  css  js  c++  java
  • CMake编译Qt程序+UI+Resources

    今天给大家讲解一下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

  • 相关阅读:
    【面试】代码默写-DCL单例
    【状态机】SCXML2
    【面试】JVM
    【面试】HashMap
    读取resource下sql脚本并执行
    Maven 二进制资源文件(excel pdf...)部署出错,乱码的解决方案
    【JVM】java内存模型
    【Spring】源码二、IOC
    mapstruct 高级用法
    warning: The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 6.0, but the range of supported deployment target versions is 8.0 to 13.2.99.
  • 原文地址:https://www.cnblogs.com/findumars/p/5914181.html
Copyright © 2011-2022 走看看