1. 程式人生 > >CMake編譯Qt程式+UI+Resources

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庫
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)

下面這一段應該算是這個水博的重點了吧…
利用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 這兩種寫法是等價的
# 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})