Cmake如何编译Qt程序
2017-06-09 22:02
337 查看
今天给大家讲解一下Cmake如何编译Qt程序。
这里说的Qt程序不只是用QtCreator写出来的程序,当然也可以是文本编辑器…。这里说的Qt程序是指,QCoreApplication,QApplication( QMainWindow,QWidget,QDialogue)类型的程序。
CMake是一个跨平台的非常通用的于编译器,用cmake命令可以生产出makefile,在利用make编译程序,这里不多说了,大家比较了解。当然首先得有CMakeLists.txt,我们手动建立一个.txt文件或者利用QtCreator新建一个CMake工程都可以,下面就来看一下,如何写这个CMakeLists,好让Qt程序能编译通过。
一个CMakeLists.txt的完整示例与分块讲解
如何添加Qt库
如何添加 .ui文件与资源文件.qrc
1. 一个CMakeLists.txt的完整示例与分块讲解
2
3
4
5
1
2
3
4
5
编译时自动打开moc,这个也是一个预编译器,比编译器的预编译还要早,它会把所有类文件中加了Q_OBJECT宏定义的编译成moc_*.cpp,对于自定义信号槽方法,必须加Q_OBJECT,不然会找不到信号槽,而且不会生成moc,完了还得手动moc缺的.cpp文件,然后改头文件。因此打开,并且该加Q_OBJECT就加 …
2
3
4
5
6
7
1
2
3
4
5
6
7
2 . 如何添加Qt库
下面的这一段是如何添加Qt的库到程序内,对于Qt5来说,写法与Qt4存在较大差别,不再利用整个包含的原则,而是分模块添加,如下,演示例子用到了5个模块,分别添加进来
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
3 . 如何添加 .ui文件与资源文件.qrc
下面这一段应该算是这个水博的重点了吧…
利用qt5_wrap_ui可以把.ui文件包裹成一个ui_*.h文件,这里定义到${ui_FILES}变量里,在可执行文件中需要加入目标文件中, 利用qt5_add_resources()命令,添加生成的qrc_*.cpp和其他源文件以及ui_*.h到target内
2
3
1
2
3
如果按照下面的写法,利用qt5_use_modules(targetname modulesname)命令,则在链接时, 即target_link_libraries时不需要再包含Qt的libraries,替代了下面这种写法:
2
1
2
实际上,对于CMake2.8.8之后的版本,一旦find_package(QtModules)之后,连include_directories()都不需要,直接用qt5_use_modules()命令就行了。
2
3
4
5
1
2
3
4
5
最后给大家个链接,有问题上去查一查
http://qt.developpez.com/doc/5.0-snapshot/cmake-manual
对于QT而言一般是采用qmake来配置工程,优点是简单直接。在许多工程开发中,QT常常会与其他的工程结合使用,这样qmake就难以管理工程。这里主要介绍使用CMake来配置QT工程。使用CMake优点之一是可以将代码文件和工程文件分离,使得工程结构更加清晰,也便于代码移植;之二是可以与其他的用CMake管理的工程结合,例如ITK,VTK,OpenCV等。采用CMake配置QT工程主要分为以下四个步骤:
1.使用QCreator创建工程MIStudio。
2. 新建一个工程目录,在其中建立两个目录,source存放代码文件,bin存放工程文件。将test工程中的代码、UI和资源文件拷贝到source目录中(main.h mainwindow.h mainwindow.cpp mainwindow.ui MIStudio.qrc)。
3. 添加CMakeLists.txt文件,文件内容有以下四个部分
(1) 添加CMakeLists.txt头信息
PROJECT (MIStudio)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
(2) 添加QT4库
FIND_PACKAGE (QT4 REQUIRED)
INCLUDE (${QT_USE_FILE})
INCLUDE_DIRECTORIES (${CMAKE_CURRENT_BINARY_DIR})
ADD_DEFINITIONS (${QT_DEFINITIONS})
(3) 将.h文件进行moc操作,ui文件进行uic操作,资源文件进行rcc操作
SET (MISTUDIO_HEADERS mainwindow.h)
SET (MISTUDIO_UIS mainwindow.ui)
SET (MISTUDIO_QRCS MIStudio.qrc)
SET (MISTUDIO_SRCS main.cpp mainwindow.cpp ${MISTUDIO_QRCS})
QT4_WRAP_CPP (MISTUDIO_HEADERS_MOC ${MISTUDIO_HEADERS})
QT4_WRAP_UI (MISTUDIO_UIS_UIC ${MISTUDIO_UIS})
QT4_ADD_RESOURCES (MISTUDIO_QRC_RCC ${MISTUDIO_QRCS})
(4) 添加工程,并连接QT库
ADD_EXECUTABLE (MIStudio ${MISTUDIO_SRCS}
${MISTUDIO_HEADERS_MOC}
${MISTUDIO_UIS_UIC}
${MISTUDIO_QRC_RCC})
TARGET_LINK_LIBRARIES (MIStudio ${QT_LIBRARIES})
4. 打开CMake对工程进行配置,选择source文件源文件目录,选择bin为编译目录配置后,生成工程并编译,即可完成一个基于CMake管理的QT工程。
这里说的Qt程序不只是用QtCreator写出来的程序,当然也可以是文本编辑器…。这里说的Qt程序是指,QCoreApplication,QApplication( QMainWindow,QWidget,QDialogue)类型的程序。
CMake是一个跨平台的非常通用的于编译器,用cmake命令可以生产出makefile,在利用make编译程序,这里不多说了,大家比较了解。当然首先得有CMakeLists.txt,我们手动建立一个.txt文件或者利用QtCreator新建一个CMake工程都可以,下面就来看一下,如何写这个CMakeLists,好让Qt程序能编译通过。
一个CMakeLists.txt的完整示例与分块讲解
如何添加Qt库
如何添加 .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 support1
2
3
4
5
1
2
3
4
5
编译时自动打开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)1
2
3
4
5
6
7
1
2
3
4
5
6
7
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)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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})1
2
3
1
2
3
如果按照下面的写法,利用qt5_use_modules(targetname modulesname)命令,则在链接时, 即target_link_libraries时不需要再包含Qt的libraries,替代了下面这种写法:
target_link_libraries(${PROJECT_NAME} ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES} ...) #${Qt5Core_LIBRARIES} == Qt5::Core 这两种写法是等价的1
2
1
2
实际上,对于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})1
2
3
4
5
1
2
3
4
5
最后给大家个链接,有问题上去查一查
http://qt.developpez.com/doc/5.0-snapshot/cmake-manual
对于QT而言一般是采用qmake来配置工程,优点是简单直接。在许多工程开发中,QT常常会与其他的工程结合使用,这样qmake就难以管理工程。这里主要介绍使用CMake来配置QT工程。使用CMake优点之一是可以将代码文件和工程文件分离,使得工程结构更加清晰,也便于代码移植;之二是可以与其他的用CMake管理的工程结合,例如ITK,VTK,OpenCV等。采用CMake配置QT工程主要分为以下四个步骤:
1.使用QCreator创建工程MIStudio。
2. 新建一个工程目录,在其中建立两个目录,source存放代码文件,bin存放工程文件。将test工程中的代码、UI和资源文件拷贝到source目录中(main.h mainwindow.h mainwindow.cpp mainwindow.ui MIStudio.qrc)。
3. 添加CMakeLists.txt文件,文件内容有以下四个部分
(1) 添加CMakeLists.txt头信息
PROJECT (MIStudio)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
(2) 添加QT4库
FIND_PACKAGE (QT4 REQUIRED)
INCLUDE (${QT_USE_FILE})
INCLUDE_DIRECTORIES (${CMAKE_CURRENT_BINARY_DIR})
ADD_DEFINITIONS (${QT_DEFINITIONS})
(3) 将.h文件进行moc操作,ui文件进行uic操作,资源文件进行rcc操作
SET (MISTUDIO_HEADERS mainwindow.h)
SET (MISTUDIO_UIS mainwindow.ui)
SET (MISTUDIO_QRCS MIStudio.qrc)
SET (MISTUDIO_SRCS main.cpp mainwindow.cpp ${MISTUDIO_QRCS})
QT4_WRAP_CPP (MISTUDIO_HEADERS_MOC ${MISTUDIO_HEADERS})
QT4_WRAP_UI (MISTUDIO_UIS_UIC ${MISTUDIO_UIS})
QT4_ADD_RESOURCES (MISTUDIO_QRC_RCC ${MISTUDIO_QRCS})
(4) 添加工程,并连接QT库
ADD_EXECUTABLE (MIStudio ${MISTUDIO_SRCS}
${MISTUDIO_HEADERS_MOC}
${MISTUDIO_UIS_UIC}
${MISTUDIO_QRC_RCC})
TARGET_LINK_LIBRARIES (MIStudio ${QT_LIBRARIES})
4. 打开CMake对工程进行配置,选择source文件源文件目录,选择bin为编译目录配置后,生成工程并编译,即可完成一个基于CMake管理的QT工程。
相关文章推荐
- 如何在QT中用cmake和qmake编译PCL程序
- QT程序如何编译
- CMake编译Widget UI Qt程序
- Qt学习(如何交叉编译一个Qt程序使其能在板子上运行) .
- Qt程序如何在Mac上用X-code编译
- linux下如何利用QtCreator编译ARM版本的Qt程序
- 使用CMake编译QT程序的一个例子(没有使用Qt特殊class)
- centos7 qt之程序编译 cant start process “cmake”
- Qt程序如何在Mac上用X-code编译
- Qt学习(如何交叉编译一个Qt程序使其能在板子上运行)
- QT 5.2.1如何编译发布IOS程序
- 如何编译支持在Windows2000下运行的Qt程序
- linux下如何利用QtCreator编译ARM版本的Qt程序
- Ubuntu下QT使用CMake编译Opencv程序
- CMake3.4.3 编译 QT5.8.0 UI 程序
- CMake编译Widget UI Qt程序
- 图解如何将Ubuntu上的Qt程序交叉编译出可在ARM平台运行的程序(五部曲)
- Qt学习(如何交叉编译一个Qt程序使其能在板子上运行)
- 如何自己编译Qt,为静态编译程序减少依赖方便发布做准备
- VS2005下如何安装配置编译并开发QT4.4.3程序