首页 > 其他分享 >Qt之QMake编译转换为CMake编译

Qt之QMake编译转换为CMake编译

时间:2023-04-21 17:57:00浏览次数:54  
标签:CMake Qt QMake 编译 test cpp

一、前言-
QMake和CMake都是用来控制编译过程的构建系统,最终生成可在选择的编译器环境中使用的本机makefile和工作区。简单来说,QMake和CMake就像类似于作曲,makefile类似于乐谱,最终由编译器完成乐章的演奏。

那么QMake和CMake有什么区别呢?-
对于纯Qt项目,QMake更加好用。QMake与QtCreator的相性很好,通过.pro文件指导Qt工程编译,方便又快捷。-
但是,如果需要对Qt以外的第三方依赖项进行配置检查,比如一个很大的项目,其中除了Qt的部分子工程外,还有其他语言的部分子工程,那么QMake就远远不如CMake好用了。-
我正在做的一个项目,就是在联调C语言编译的嵌入式应用层代码时,从QMake转向了CMake。

二、CMake基础-
CMake有自己的一套语法,参考博文:“轻松搞定CMake”系列之CMakeLists文件编写语法规则详解。-
对我们最重要的就是其中外部构建的内容,归纳下来就是:

  • ADD_SUBDIRECTORY:告诉CMake去子目录中查看可用的CMakeLists.txt文件
  • ADD_EXECUTABLE:告诉工程生成一个可执行文件。
  • ADD_LIBRARY:告诉工程生成一个库文件。
  • FIND_LIBRARY:查找库所在目录。
  • SET:用于设置变量,相当于为变量取别名。
  • CMAKE_MODULE_PATH:定义cmake模块所在路径。
  • EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH:通过 SET 指令重新定义EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 变量来指定最终的目标二进制的位置。

三、将QMake转换为CMake-
一个典型的.pro文件如下:

QT += core
QT -= gui
CONFIG += c++11
TARGET = test
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
QT += network
SOURCES += main.cpp \
    test_interface.cpp \
    motomanlibrary.cpp \
    processing.cpp
SOURCES += test_interface.h \
    motomanlibrary.h \
    processing.h

下面将它转换为CMake的写法,首先要创建一个CMakeLists.txt文件,然后开始编辑:-
1、QMake:用到的Qt相关模块。

QT += core
QT -= gui

CMake:搜索模块。

find_package(Qt5Core REQUIRED)

2、QMake:其他编译器标志。

CONFIG += c++11

CMake::扩展列表所需的编译器标志集。

set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -std=c++0x")

3、QMake:源文件。

SOURCES += main.cpp \
    test_interface.cpp \
    motomanlibrary.cpp \
    processing.cpp

CMake:创建文件列表。

set(SOURCES
    main.cpp
    test_interface.cpp
    motomanlibrary.cpp
    processing.cpp
)

4、QMake:头文件。

SOURCES += test_interface.h \
    motomanlibrary.h \
    processing.h

CMake:头文件位置。

nclude_directory(.) #  or include_directory(${CMAKE_CURRENT_SOURCE_DIR})
include_directory(some/where/else)

5、QMake:要建立的目标。

TARGET = test

CMake:设置目标名称,添加源,链接所需的库。

add_executable(test ${SOURCES} )
qt5_use_modules(test Core Network)

四、编译-
编写好CMake文件后,手动测试一下CMakeLists.txt是否配置正确。建立一个build目录,在目录下执行命令cmake ..,生成Makefile脚本。然后make -j,即可在指定的目录下生成我们需要的可执行文件了。

标签:CMake,Qt,QMake,编译,test,cpp
From: https://www.cnblogs.com/cps666/p/17341265.html

相关文章

  • Qt5.14+CMake3.22+OpenCV4.5
    原文地址zhuanlan.zhihu.com下载链接首先需要下载对应的软件,下载链接和我选择的版本如下(仅作参考):QtIndexof/archive/qt/5.14/5.14.2,qt-opensource-windows-x86-5.14.2.exeCMakeDownload|CMake,cmake-3.23.0-windows-x86_64.msi注意x86指的是32位系统;x64指的是64位系......
  • CMake
    原文地址zhuanlan.zhihu.com​目录收起step0:环境配置step1:构建最小项目构建、编译和运行外部构建与内部构建step2:优化CMakeLists.txt文件set与PROJECT_NAME添加版本号和配置头文件添加编译时间戳指定C++标准step3:添加库step4:将库设置为可选项step5:添加库的使用要求......
  • MQTT-发布与订阅的报文
    MQTT发布订阅流程在MQTT发布/订阅模式中,一个客户端既可以是发布者,也可以是订阅者,也可以同时具备这两个身份。当客户端发布一条消息时,它会被发送到代理,然后代理将消息路由到该主题的所有订阅者。当客户端订阅一个主题时,它会收到代理转发到该主题的所有消息发布消息报文-Publish......
  • Qt使用Http协议进行通信
    原文地址blog.csdn.net原文链接在使用Qt框架进行应用开发的过程中,很多时候需要进行客户端与服务端的网络通信,这时候就需要Qt的internet模块。而网络通信中最常用的协议就是http协议,Qt对http协议的调用进行了封装,使用非常方便。这里对常用的http请求demo做一下总结,方便大家参......
  • MQTT基础介绍
    MQTT与HTTP的区别HTTP协议是客户端与服务端直连请求与响应MQTT是基于发布订阅模型的轻量级的消息传输协议MQTT能力发布:Publish订阅:Subscribe代理:Broker,管理通信执行模式:客户端发送消息到broker,broker将消息发送给订阅过的客户端MQTT通信模式一对一:点对点通信......
  • c++编译报错 error: parse error in template argument list
    [57%]BuildingCXXobjectdnet/CMakeFiles/dnet.dir/dconfig/dconfig_manager.cpp.oInfileincludedfrom/home/vi/git/dos/dnet/dconfig/dconfig_manager.cpp:1:/home/vi/git/dos/dnet/./dconfig/dconfig_manager.h:Inmemberfunction‘Tdnet::dconfig_manager::get_......
  • 交叉编译gRPC
    重点要参考官方文档:https://github.com/grpc/grpc/blob/master/test/distrib/cpp/run_distrib_test_cmake_aarch64_cross.sh如果要支持AG35或AG55X,要修改camkeconfig.按官方文档可能还需要安装libssl-dev.此次编译源码选的grpc-v1.45.2,官网下载,或gitbub下载都可以. ......
  • GCC预处理、编译、汇编、链接全过程
    //hello.c#include<stdio.h>intmain(void){printf("Hello,world!\n");return0;} 预处理:替代宏,引入头文件cpphello.c>hello.i 编译:gcc-Wall-Shello.i(生成hello.s) 汇编:ashello.s-ohello.o(生成hello.o) 链接:复杂ld版:ld-dynamic-linke......
  • ImportError: DLL load failed while importing QtChart: 找不到指定的模块
    这个错误通常是由于您的Python环境缺少QtChart模块或QtChart模块依赖的库文件之一导致的。解决此问题的方法可能因操作系统和Python环境而异,但下面是一些常见的解决方法:检查是否已安装QtChart模块和其依赖项。您可以使用pip命令在终端中安装QtChart模块:Copycodepipinstal......
  • MQTT报文分析
    一、问题引入MQTT属于应用层协议,基于TCP/IP架构实现,那么它的报文是如何定义的呢?或许可以像分析http协议那样,利用抓包工具:wireshark分析报文。二、解决过程......