cmake 构建Qt存在多个子项目的应用

概述:一般在开发UI应用时候我们都会存在多个子项目,比如一个是主UI界面的项目,有些动态库的项目,主UI中用到子项目中的动态库,我们来看看如何利用cmake来构建这样的一个工程,方便我们在跨平台中开发(macos、windows、linux)

前提条件:安装了CMake Qt5开发环境

1、工程的项目结构

1.1 目录说明

        CCQTAPP目录 :项目的主目录

        CMakeLists.txt: 项目的主CMakeLists.txt

        cc-desktop目录: 主程序(主要是UI)

        cc-engine目录: 提供给主程序调用的动态库(主要提供一些数据获取接口或者其他逻辑)

2、项目主CMakeLists.txt

cmake_minimum_required(VERSION 3.6)set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "My multi config types" FORCE)set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER AutoMoc)if(UNIX AND NOT APPLE)set(LINUX 1)
endif(UNIX AND NOT APPLE)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)project(CcQtApp)if(WIN32)add_definitions("/wd4819")
elseif(APPLE) SET(CMAKE_OSX_DEPLOYMENT_TARGET "10.12")
endif(WIN32)macro(ADD_FRAMEWORK fwname appname)
find_library(FRAMEWORK_${fwname}NAMES ${fwname}PATHS ${CMAKE_OSX_SYSROOT}/System/LibraryPATH_SUFFIXES FrameworksNO_DEFAULT_PATH)
if( ${FRAMEWORK_${fwname}} STREQUAL FRAMEWORK_${fwname}-NOTFOUND)MESSAGE(ERROR ": Framework ${fwname} not found")
else()TARGET_LINK_LIBRARIES(${appname} ${FRAMEWORK_${fwname}})MESSAGE(STATUS "Framework ${fwname} found at ${FRAMEWORK_${fwname}}")
endif()
endmacro(ADD_FRAMEWORK)if(WIN32)set(QtVersion 5.14)
elseif(APPLE)set(QtVersion 5.7)
elseif(LINUX)set(QtVersion 5.14)
endif()# 将项目目录组织化的宏,使用cmake的source_group函数
macro(cc_source_group_by_dir source_files)       set(sgbd_cur_dir ${CMAKE_CURRENT_SOURCE_DIR}/)foreach(sgbd_file ${${source_files}})string(REGEX REPLACE ${sgbd_cur_dir} "" sgbd_fpath ${sgbd_file})string(REGEX REPLACE "[^/\\\\]+$" "" sgbd_group_name ${sgbd_fpath})if(sgbd_group_name)string(REPLACE "/"   "\\\\"  sgbd_group_name_normal ${sgbd_group_name})source_group(${sgbd_group_name_normal} FILES ${sgbd_file})endif(sgbd_group_name)	endforeach(sgbd_file)
endmacro(cc_source_group_by_dir)# 添加子项目cc-desktop
add_subdirectory(cc-desktop)# 添加子项目cc-engine
add_subdirectory(cc-engine)

3、子项目cc-desktop

        3.1 cc-desktop的CMakeLists.txt

                

cmake_minimum_required(VERSION 3.6)project(CcQtApp)SET(CMAKE_PREFIX_PATH $ENV{QTDIR})find_package(Qt5Core $ENV{QTVERSION} REQUIRED)
find_package(Qt5Concurrent $ENV{QTVERSION} REQUIRED)
find_package(Qt5Sql $ENV{QTVERSION} REQUIRED)
find_package(Qt5Gui $ENV{QTVERSION} REQUIRED)
find_package(Qt5Widgets $ENV{QTVERSION} REQUIRED)
find_package(Qt5Network $ENV{QTVERSION} REQUIRED)
find_package(Qt5Multimedia $ENV{QTVERSION} REQUIRED)set(CMAKE_AUTOMOC ON)                    
set(CMAKE_INCLUDE_CURRENT_DIR ON)FILE(GLOB_RECURSE FORMS "*.ui")
QT5_WRAP_UI(FORMS_UIC ${FORMS})file(GLOB_RECURSE All_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.mm ${CMAKE_CURRENT_SOURCE_DIR}/*.m ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/*.mm ${CMAKE_CURRENT_SOURCE_DIR}/*.c ${CMAKE_CURRENT_SOURCE_DIR}/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/*.hh ${CMAKE_CURRENT_SOURCE_DIR}/*.h ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp)cc_source_group_by_dir(All_SOURCES)	include_directories(${Qt5Core_PRIVATE_INCLUDE_DIRS}${Qt5Widgets_PRIVATE_INCLUDE_DIRS}${CMAKE_CURRENT_SOURCE_DIR}${CMAKE_CURRENT_SOURCE_DIR}/../cc-engine/include
)if(WIN32)set(exe_property WIN32)set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD /Zi /MP /Gm- /Qpar /wd4996")if(${close_optimize} STREQUAL "ON")set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Od")endif()set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF /LARGEADDRESSAWARE")add_definitions(-DUNICODE -D_UNICODE -D_SCL_SECURE_NO_WARNINGS -DWIN32 -DV_LOG -DCURL_STATICLIB)link_directories(${CMAKE_CURRENT_BINARY_DIR}/../cc-engine/$(CONFIGURATION))	set(LINK_LIBRARY CcEngine.lib)elseif(APPLE)SET(BUILD_WITH_INSTALL_RPATH TRUE)set(exe_property MACOSX_BUNDLE)set (CMAKE_CXX_FLAGS "--std=gnu++11 ${CMAKE_CXX_FLAGS}")message("CMAKE_OSX_DEPLOYMENT_TARGET is ${CMAKE_OSX_DEPLOYMENT_TARGET}")message(${CMAKE_CURRENT_BINARY_DIR})set(LINK_LIBRARY libCcEngine.dylib)link_directories(${CMAKE_CURRENT_BINARY_DIR}/../cc-engine/$(CONFIGURATION))	elseif(LINUX)SET(CMAKE_BUILD_TYPE Debug)SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
endif(WIN32)set(NAME CcApp)
add_executable(${NAME} ${exe_property} ${All_SOURCES} ${FORMS_UIC} ${MACOSX_BUNDLE_ICON_FILE})if(WIN32)
elseif(APPLE)ADD_FRAMEWORK(AVFoundation CcApp)ADD_FRAMEWORK(Foundation CcApp)ADD_FRAMEWORK(Security CcApp)ADD_FRAMEWORK(Carbon CcApp)ADD_FRAMEWORK(Appkit CcApp)ADD_FRAMEWORK(VideoDecodeAcceleration CcApp)ADD_FRAMEWORK(VideoToolbox CcApp)	ADD_FRAMEWORK(SystemConfiguration CcApp)	set_target_properties(CcApp PROPERTIES XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym")set_target_properties(CcApp PROPERTIES XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS "YES")set_target_properties(CcApp PROPERTIES XCODE_ATTRIBUTE_SEPARATE_STRIP "YES")set_target_properties(CcApp PROPERTIES XCODE_ATTRIBUTE_STRIP_STYLE "Non-Global Symbols")
endif(WIN32)if(APPLE)set_target_properties(${NAME} PROPERTIES XCODE_ATTRIBUTE_ARCHS "x86_64")
endif()if(WIN32)qt5_use_modules(${NAME} WinExtras)
elseif(APPLE)
endif(WIN32)qt5_use_modules(${NAME} Core)
qt5_use_modules(${NAME} Concurrent)
qt5_use_modules(${NAME} Sql)
qt5_use_modules(${NAME} Gui)
qt5_use_modules(${NAME} Widgets)
qt5_use_modules(${NAME} Network)
qt5_use_modules(${NAME} Multimedia)
qt5_use_modules(${NAME} WebEngineWidgets)
qt5_use_modules(${NAME} WebChannel)target_link_libraries(${NAME} ${LINK_LIBRARY})

        3.2 cc-desktop的main.cpp文件

#include <QApplication>
#include <QWidget>
#include <QDebug>//cc-engine里面生成的动态库
#include "CcDataManage.h"int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;window.resize(650, 350);window.setWindowTitle("简单的cmake构建的Qt窗口程序");window.show();CcDataManage data_manage;qDebug() << "Get Data From cc-engine dynamic library: " << data_manage.GetCurrentJsonData();return app.exec();
}

4、子项目cc-engine

        4.1 cc-engine的CMakeLists.txt

             这个主要是生成动态库

cmake_minimum_required(VERSION 3.6)project(CCEngine)SET(CMAKE_PREFIX_PATH $ENV{QTDIR})# 找到Qt相关库并导入项目,确保其被正确安装在系统中
find_package(Qt5Core $ENV{QTVERSION} REQUIRED)
find_package(Qt5Gui $ENV{QTVERSION} REQUIRED)
find_package(Qt5Widgets $ENV{QTVERSION} REQUIRED)
find_package(Qt5Network $ENV{QTVERSION} REQUIRED)file(GLOB_RECURSE All_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/*.c ${CMAKE_CURRENT_SOURCE_DIR}/*.cc${CMAKE_CURRENT_SOURCE_DIR}/*.mm ${CMAKE_CURRENT_SOURCE_DIR}/*.hh ${CMAKE_CURRENT_SOURCE_DIR}/*.h)cc_source_group_by_dir(All_SOURCES)	set(CMAKE_AUTOMOC ON)                    
set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${Qt5Core_INCLUDE_DIRS}${CMAKE_CURRENT_SOURCE_DIR}/include)if(WIN32)set(exe_property WIN32)set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT /Zi /MP /Qpar /Gm-")set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")add_definitions(-DUNICODE -D_UNICODE -D_SCL_SECURE_NO_WARNINGS -DWIN32 -DCCENGINE_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB)elseif(APPLE)SET(BUILD_WITH_INSTALL_RPATH TRUE)set(exe_property MACOSX_BUNDLE)set (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")	add_definitions(-DQT_CORE_LIB -DQT_GUI_LIB)	
elseif(LINUX)
endif(WIN32)set(NAME CcEngine)# 生成动态库CcEngine.dylib
add_library(${NAME} SHARED ${All_SOURCES})if(WIN32)add_custom_command(TARGET CcEngine PRE_BUILD COMMAND if exist ${CMAKE_CURRENT_BINARY_DIR}/$(Configuration) cmake -E remove_directory ${CMAKE_CURRENT_BINARY_DIR}/$(Configuration))	
elseif(APPLE)set_target_properties(${NAME} PROPERTIES XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym")set_target_properties(${NAME} PROPERTIES XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS "YES")set_target_properties(${NAME} PROPERTIES XCODE_ATTRIBUTE_SEPARATE_STRIP "YES")set_target_properties(${NAME} PROPERTIES XCODE_ATTRIBUTE_STRIP_STYLE "Non-Global Symbols")target_link_libraries(${NAME} "-framework CoreVideo" "-framework CoreImage" "-framework CoreGraphics" "-framework AVFoundation")endif()if(APPLE)set_target_properties(${NAME} PROPERTIES XCODE_ATTRIBUTE_ARCHS "x86_64")
endif()# 将Qt的相关模块链接到相关目标(target)中,以使得目标能够使用Qt的相关模块功能
qt5_use_modules(${NAME} Core)
qt5_use_modules(${NAME} Gui)
qt5_use_modules(${NAME} Widgets)
qt5_use_modules(${NAME} Network)target_link_libraries(CcEngine ${Qt5Core_LIBRARIES} ${LINK_LIBRARY})

5、生成项目

5.1 生成xcode工程

        1.主目录中新建build 

        2. cd build

        3. cmake -G"Xcode" ..

          

5.2 生成vistual stdio 2019项目

        1.在主目录中新建build

        2.cd build

        3.cmake -G"Visual Studio 16 2019" -A Win32 ..

        4.在build里面打开CcQtApp.sln解决方案

        

6、gitee上有这个项目工程的源码

       windows macos linux都可以用这个CMake来构建

      链接地址: CcQtApp: Qt测试demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2812456.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

安防视频监控平台EasyNVR级联视频上云管理平台EasyNVS,出现报错“i/o deadline reached”该如何解决?

上云网关管理平台EasyNVS视频综合管理系统具备汇聚与管理EasyGBS、EasyNVR等平台的能力&#xff0c;系统可以将接入的视频资源实现视频能力统一输出&#xff0c;并能进行远程可视化运维等管理功能&#xff0c;还能解决设备现场没有固定公网IP却需要在公网直播的需求。 有用户反…

golang gin单独部署vue3.0前后端分离应用

概述 因为公司最近的项目前端使用vue 3.0&#xff0c;后端api使用golang gin框架。测试通过后&#xff0c;博文记录&#xff0c;用于备忘。 步骤 npm run build&#xff0c;构建出前端项目的dist目录&#xff0c;dist目录的结构具体如下图 将dist目录复制到后端程序同级目录…

Bluesky数据采集框架-4

编写自定义计划 如在以上简单自定义中提到&#xff0c;count()和scan()的"预装配"计划是从更小的"plan stubs"构建的。我们组合和匹配"stubs"和/或"预装配"计划来构建自定义计划。 有很多计划stubs&#xff0c;因此导入整个模块并且…

低价对品牌渠道的危害

品牌价值的体现主要在价格&#xff0c;比如要与竞品体现差异&#xff0c;除了产品功能上有做出差异&#xff0c;价格上也需要设置不同的阶梯&#xff0c;但如果经销商不遵守这个体系&#xff0c;或者非授权店铺随意低价&#xff0c;对于品牌来说都是非常不好的事情&#xff0c;…

ubuntu20.04安装和使用 Maldet (Linux Malware Detect)

1、下载 Maldet sudo wget http://www.rfxn.com/downloads/maldetect-current.tar.gz 2、解压Maldet sudo tar -xvf maldetect-current.tar.gz 3、进入到Maldet目录&#xff0c;然后运行安装脚本 sudo ./install.sh 4、安装ClamAV sudo apt-get update sudo apt-get in…

【程序员英语】【美语从头学】初级篇(入门)(笔记)Lesson 16 At the Shoe Store 在鞋店

《美语从头学初级入门篇》 注意&#xff1a;被 删除线 划掉的不一定不正确&#xff0c;只是不是标准答案。 文章目录 Lesson 16 At the Shoe Store 在鞋店对话A对话B笔记会话A会话B替换 Lesson 16 At the Shoe Store 在鞋店 对话A A: Do you have these shoes in size 8? B:…

交叉编译qt到arm平台

使用pkg-config命令查看xxx包是否存在&#xff1a; pkg-config --print-errors xxx pkg-config的搜索路径可以通过环境变量PKG_CONFIG_PATH指定。需要在运行./configure 之前指定。 ./configure -release -qt-libjpeg -qt-libpng -qt-zlib -qt-pcre -xplatform linux-aarch64-…

【Git教程】(三)提交详解 —— add、commit、status、stach命令的说明,提交散列值与历史,多次提交及忽略 ~

Git教程 提交详解 1️⃣ 访问权限与时间戳2️⃣ add命令与 commit 命令3️⃣ 提交散列值4️⃣ 提交历史5️⃣ 一种特别的提交查看方法6️⃣ 同一项目的多部不同历史6.1 部分输出&#xff1a;-n6.2 格式化输出&#xff1a;--format、--oneline6.3 统计修改信息&#xff1a;--st…

yolov8学习笔记(三)添加注意力机制+源码简单了解

目录 一、前言 二、注意力机制添加 三、源码简单了解 1、YOLO类中的——私有Model类 2、在哪来初始化的网络模型 3、注释版下载 4、笔记下载 一、前言 因为我没有学过pytorch&#xff0c;所以看源码也是一头雾水&#xff0c;不过大概看懂的是yolo是对pytorch的再次封装&a…

聚集高速托盘类四向穿梭车ASRV|一车跑全仓可获得10000个货位的HEGERLS智能搬运机器人

随着国内外制造业加速转型升级&#xff0c;越来越多的企业需要进行物流智能化升级&#xff0c;但是往往受到仓库面积、高度、形状等现实条件的限制&#xff0c;以及市场不确定性因素的影响。因此&#xff0c;相对于投资传统的自动化立体库&#xff0c;企业更倾向于选择智能化、…

LeetCode刷题---平均售价

解题思路&#xff1a; 首先对Prices表和UnitsSold表进行Left join操作&#xff0c;之后按照购买日期位于定价开始和结束日期之间的条件进行过滤 按照product_id进行分组&#xff0c;对组内进行计算 将price和units的乘积进行累加&#xff0c;将units的值进行累加&#xff0c;之…

Django学习笔记-ModelForm使用(完全依赖)

1.创建模型 ,code,name,sex,entrydate 2.模型映射 python manage.py makemigrations myapp01,python manage.py migrate 3.创建模型表单,继承forms.ModelForm,Meta:元数据,models需引入,fields填写引用的模型变量 4.创建testModelForm.html,添加urls 5.views编写testmodelfo…

input输入框过滤非金额内容保留一个小数点和2位小数

这篇是输入框过滤非金额内容保留一个小数点和2位小数&#xff0c;金额的其他格式化可以看这篇文章常用的金额数字的格式化方法 js方法直接使用 该方式可以直接使用过滤内容&#xff0c;也可以到onInput或onblur等地方过滤&#xff0c;自行使用 /*** 非金额字符格式化处理* p…

精益思维引领AI创新浪潮:从理念到实践的蜕变!

在人工智能&#xff08;AI&#xff09;飞速发展的今天&#xff0c;精益思维作为一种追求卓越、持续改进的管理哲学&#xff0c;正逐渐成为推动AI创新的重要动力。本文&#xff0c;天行健咨询将探讨精益思维如何与AI创新相结合&#xff0c;以及这种结合如何推动科技进步和社会发…

springboot-基础-eclipse集成mybatis+使用方法+排错

备份笔记。所有代码都是2019年测试通过的&#xff0c;如有问题请自行搜索解决&#xff01; 目录 集成mybatis安装mybatis的jar包安装插件&#xff1a;mybatis-generator安装方法生成方法报错&#xff1a;java.lang.RuntimeException: Exception getting JDBC Driver mybatis注解…

一文讲清DTO、BO、PO、VO

DTO、BO、PO、VO是什么&#xff1f; 在后端开发中&#xff0c;比如传统的MVC架构和现在流行的DDD架构&#xff0c;经常会使用到下列几种对象的概念 DTO (Data Transfer Object) 数据传输对象&#xff1a; DTO设计模式用于将数据从服务端传输到客户端&#xff0c;或者在不同的…

使用 Koltin 集合时容易产生的 bug 注意事项

来看下面代码&#xff1a; class ChatManager {private val messages mutableListOf<Message>()/*** 当收到消息时回调*/fun onMessageReceived(message: Message) {messages.add(message)}/*** 当删除消息时回调*/fun onMessageDeleted(message: Message) {messages.r…

jenkins + gitlab + nginx 自动部署(webhook)

一、意义 当代码仓库被更新时&#xff0c;Jenkins会自动拉取代码进行构建。 适用于测试环境 二、jenkins gitlab nginx 自动部署(webhook) 1.准备服务器 ①安装Jenkins&#xff08;Java17&#xff0c;tomcat9&#xff09; ②安装gitlab &#xff08;16&#xff09; ③…

[JavaWeb玩耍日记]Mybatis快速入门与增删改查

目录 模块一&#xff1a;快速入门 1.创建数据库&#xff0c;插入数据 2.创建maven模块后&#xff0c;需要导入的依赖有哪些&#xff1f; 3.想要输出查询到的数据(包括日志打印)&#xff0c;需要创建哪些文件&#xff1f; 4.如何放置UserMapper接口与User类&#xff1f; 5.…

SpringCloud-Docker安装与详解

Docker 是一款强大的容器化平台&#xff0c;通过其轻量级的容器技术&#xff0c;使应用程序的开发、部署和管理变得更加便捷和高效。本文将深入探讨 Docker 的安装过程&#xff0c;并详细解析其基本概念、组件及常用命令&#xff0c;以帮助读者充分理解和熟练使用 Docker。企业…