cmake多模块架构, DLL依赖编译

整体结构:
在这里插入图片描述

最外层的cmakelist

CMakeLists.txt

project(cmakeMulPackage)
cmake_minimum_required(VERSION 3.17)
set(CMAKE_CXX_STANDARD 11)#设置环境相关
message("====================set env.cmake===================")
message("CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}")
set(PROJECT_LIBRARY_DIR ${PROJECT_SOURCE_DIR}/Library)
set(PROJECT_LIBRARY_INCLUDE_DIR ${PROJECT_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/include)
set(PROJECT_LIBRARY_LIB_DIR ${PROJECT_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/lib)
set(PROJECT_LIBRARY_DLL_DIR ${PROJECT_LIBRARY_DIR}/${CMAKE_BUILD_TYPE}/dll)
message("PROJECT_LIBRARY_DIR is ${PROJECT_LIBRARY_DIR}")
message("PROJECT_LIBRARY_INCLUDE_DIR is ${PROJECT_LIBRARY_INCLUDE_DIR}")
message("PROJECT_LIBRARY_LIB_DIR is ${PROJECT_LIBRARY_LIB_DIR}")
message("PROJECT_LIBRARY_DLL_DIR is ${PROJECT_LIBRARY_DLL_DIR}")#同时生成lib与DLL
message("PROJECT_BINARY_DIR is ${PROJECT_BINARY_DIR}")
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) #DLL生成路径
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) #lib生成路径
set(CMAKE_PDB_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) #pdb生成路径# 处理编译字符集问题
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")#设置QT相关配置
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_PREFIX_PATH D:/Library/Qt5.14.2/5.14.2/msvc2017_64/lib/cmake) # 配置QT路径
find_package(Qt5 COMPONENTS # 查找QT的模块CoreGuiWidgetsREQUIRED)
message(STATUS "CMAKE_PREFIX_PATH is ${CMAKE_PREFIX_PATH}")message("====================set include path.cmake===================")
#定义头文件需要寻址的路径
include_directories(${PROJECT_LIBRARY_INCLUDE_DIR} #头文件App/include #模块头文件AppModuleA/include #模块头文件AppModuleB/include #模块头文件
)
#定义库文件需要寻址的路径
link_directories(${PROJECT_LIBRARY_LIB_DIR}
)message("====================set sub directory.cmake===================")
#添加一个子目录并构建该子目录
add_subdirectory(AppModuleA)
add_subdirectory(AppModuleB)
add_subdirectory(App)

主程序

CMakeLists.txt

#定义头文件路径
include_directories(./include)#把目录src和inc下面的所有文件作为变量存储
file(GLOB_RECURSE SRC_FILES "src/*")
file(GLOB_RECURSE INC_FILES "include/*")# 针对存在Q_OBJECT宏的文件,需要MOC,则把其他模块的.h文件加进来了
set(MOC_FILES${PROJECT_SOURCE_DIR}/AppModuleB/include/module_b.h
)#生成可执行exe
add_executable(cmakeMulPackage ${SRC_FILES} ${INC_FILES} ${MOC_FILES})#加载依赖的库
target_link_libraries(cmakeMulPackageAppModuleAAppModuleB
)#将生成的依赖复制到可执行目录下
message("====================set copy final.cmake===================")
file(GLOB_RECURSE MY_COMPONENTS "${PROJECT_LIBRARY_DLL_DIR}/*")
if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)#拷贝依赖的DLL和exeforeach (MY_COMPONENT ${MY_COMPONENTS})add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${MY_COMPONENT}" "${PROJECT_BINARY_DIR}")message(STATUS "COPY DLL ${MY_COMPONENT}")endforeach (MY_COMPONENT)
endif ()

main_app.h

//
// Created by zhe.xiao on 2023/12/15.
//#pragma once
#include <iostream>class MainApp
{
public:static void run();
};

main_app.cpp

//
// Created by zhe.xiao on 2023/12/15.
//#include "main_app.h"
#include "module_a.h"
#include "module_b.h"void MainApp::run()
{std::cout << "hello main" << "\n";ModuleA::run();auto moduleA = new ModuleB();moduleA->start();auto tModule = new ModuleB();tModule->start();std::this_thread::sleep_for(std::chrono::seconds(10));
}

main.cpp

#include "main_app.h"int main() {MainApp::run();return 0;
}

AppModuleA 子模块

CMakeLists.txt

#定义头文件路径
include_directories(./include)#把目录src和inc下面的所有文件作为变量存储
file(GLOB_RECURSE SRC_FILES "src/*")
file(GLOB_RECURSE INC_FILES "include/*")#生成库
add_library(AppModuleA SHARED ${SRC_FILES} ${INC_FILES})

module_a.h

//
// Created by zhe.xiao on 2023/12/15.
//#pragma onceclass ModuleA
{
public:static void run();
};

module_a.cpp

//
// Created by zhe.xiao on 2023/12/15.
//#include "module_a.h"
#include <iostream>void ModuleA::run()
{std::cout << "ModuleA run" << "\n";
}

AppModuleB 子模块

CMakeLists.txt

#定义头文件路径
include_directories(./include)#把目录src和inc下面的所有文件作为变量存储
file(GLOB_RECURSE SRC_FILES "src/*")
file(GLOB_RECURSE INC_FILES "include/*")#生成库
add_library(AppModuleB SHARED ${SRC_FILES} ${INC_FILES})#添加依赖库
target_link_libraries(AppModuleB Qt5::Core)

module_b.h

//
// Created by zhe.xiao on 2023/12/15.
//#pragma once#include <QThread>class ModuleB: public QThread
{Q_OBJECTpublic:ModuleB(QObject* parent = nullptr);~ModuleB();protected:void run();
};

module_b.cpp

//
// Created by zhe.xiao on 2023/12/15.
//#include "module_b.h"
#include <iostream>
#include <QString>ModuleB::ModuleB(QObject* parent) : QThread(parent)
{}ModuleB::~ModuleB()
{}void ModuleB::run()
{std::cout << "ModuleB run" << "\n";QString data("QString data");std::cout << data.toStdString() << "\n";
}

三方依赖的DLL和头文件

主要通过设置环境变量定义具体路径。
在这里插入图片描述

然后通过add_custom_command进行拷贝dll到生成路径

message("====================set copy final.cmake===================")
file(GLOB_RECURSE MY_COMPONENTS "${PROJECT_LIBRARY_DLL_DIR}/*")
if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)#拷贝依赖的DLL和exeforeach (MY_COMPONENT ${MY_COMPONENTS})add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${MY_COMPONENT}" "${PROJECT_BINARY_DIR}")message(STATUS "COPY DLL ${MY_COMPONENT}")endforeach (MY_COMPONENT)
endif ()

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

消息通知(Notification)系统优化

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

连续型随机变量的概率密度

如果对于随机变量的分布函数&#xff0c;存在非负可积函数&#xff0c;使得对于任意实数&#xff0c;有&#xff1a; 那么就称为连续型随机变量&#xff0c;称为的概率密度函数&#xff0c;简称密度函数。

C语言leetcode集训二:字符串(1):字符串遍历

今天集训的内容是字符串中的字符串遍历题&#xff0c;仍然是简单题&#xff0c;但也可以掌握一些字符串所必要的知识&#xff0c;加深对字符串的理解&#xff0c;关于字符数组和字符串&#xff0c;字符串的输入输出在这就不再做过多赘述&#xff0c;关于字符串的问题&#xff0…

深度学习 Day16——P5运动鞋识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU&#xff08;如果设备上支持GPU就使用GPU,否则使用C…

CSS的三大特性(层叠性、继承性、优先级---------很重要)

CSS 有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级。 层叠性 场景&#xff1a;相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突 的问题 原则&#xff1a;  样式冲突&am…

行政前台快递管理教程

行政前台快递管理&#xff0c;成了企业前台工作人员不可逃避的话题。看似简单的几个字&#xff0c;却难倒了不少人。身边有从事行政前台工作的朋友&#xff0c;应该或多或少都会听其抱怨过...... 为什么公司寄件管理这么难&#xff1f; 为什么员工不能按规定寄件&#xff1f;…

我在代码随想录|写代码之203. 移除链表元素,707. 设计链表,206. 反转链表

​第一题 ​​ 203. 移除链表元素 题目: 思路分析: 我们要删除节点说白了就是将节点移除,将要删除的节点的前一个的next域移动到要删除节点的next域,我们可以这样写当我们运到我们要删除节点然后件他删除,那么怎么删除?我们可以直接让我们要删除的元素找不到。如果我们直接将…

MySQL事务与MVCC详解

前置概念之事务 在开始MVCC的讨论之前&#xff0c;我们必须了解一些关于事务的概念。 什么是事务 现在我们开发的一个功能需要进行操作多张表&#xff0c;假如我们遇到以下几种情况: 某个逻辑报错数据库连接中断某台服务器突然宕机… 这时候我们数据库执行的操作可能才到一…

理解Socket

前言 我在去年就学习过Java中Socket的使用&#xff0c;但对于Socket的理解一直都是迷迷糊糊的。看了网上很多关于Socket的介绍&#xff0c;看完还是不太理解到底什么是Socket&#xff0c;还是很迷。直到最近在学习计算机网络&#xff0c;我才对Socket有了一个更深地理解。之前一…

Chapter 7 - 3. Congestion Management in Ethernet Storage Networks以太网存储网络的拥塞管理

Pause Threshold for Long Distance Links长途链路的暂停阈值 This section uses the following basic concepts: 本节使用以下基本概念: Bit Time (BT): It is the time taken to transmit one bit. It is the reciprocal of the bit rate. For example, BT of a 10 GbE po…

Axure中动态面板使用及轮播图多种登录方式左侧导航栏之案列

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、轮播图简介 1、什么是轮播图 2、轮播图有什么作用 3、轮播图有什么特点 4、轮播图适应范围 5、…

使用opencv的Canny算子实现图像边缘检测

1 边缘检测介绍 图像边缘检测技术是图像处理和计算机视觉等领域最基本的问题&#xff0c;也是经典的技术难题之一。如何快速、精确地提取图像边缘信息&#xff0c;一直是国内外的研究热点&#xff0c;同时边缘的检测也是图像处理中的一个难题。早期的经典算法包括边缘算子方法…