cmake 使用include 分层加载

news2024/11/17 2:51:24

include命令
说到cmake,可能最先想到的就是CmakeLists.txt文件,但是在很多情况下,也会看到.cmake文件。
cmake文件是干什么的,甚至会想.cmake文件是不是cmake的正统文件,而CmakeLists.txt并不是。但其实,CmakeLists.txt才是cmake的正统文件,而.cmake文件是一个模块文件,可以被include到CMakeLists.txt中。

include指令一般用于语句的复用,也就是说,如果有一些语句需要在很多CMakeLists.txt文件中使用,为避免重复编写,可以将其写在.cmake文件中,然后在需要的CMakeLists.txt文件中进行include操作就行了。

include指令的结构为:
include(<file|module> [OPTIONAL] [RESULT_VARIABLE ] [NO_POLICY_SCOPE])
注意:
为了使CMakeLists.txt能够找到该文件,需要指定文件完整路径(绝对路径或相对路径),当然如果指定了CMAKE_MODULE_PATH,就可以直接include该目录下的.cmake文件了。

举例说明:
在这里插入图片描述

默认的cmakelists

#工程名
project(uXXXXSoftware)

#cmake最低版本
cmake_minimum_required(VERSION 3.17)

#设定cmake模块的路径
set(CMAKE_MODULE_PATH
        ${PROJECT_SOURCE_DIR}/cmake # 项目cmake
        ${PROJECT_SOURCE_DIR}/cmake/base # 通用cmake
        ${CMAKE_MODULE_PATH})

#加载配置项
include(set_env)

#加载项目配置
include(init_project)

#加载编译配置
include(set_compile_arg)

base/set_env.cmake

message(STATUS "====================set_env.cmake===================")

# 处理编译字符集问题
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")

#C++标准
set(CMAKE_CXX_STANDARD 11)

# 开启QT用于预处理的组件
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

#设置全局系统变量
set(PROJECT_EXTERNAL_DIR "D:/MyLib")

# 设置webview2变量
set(wixlabrary_INCLUDE_DIRS "${PROJECT_EXTERNAL_DIR}/include/external/WixLibrary")
set(webview2_INCLUDE_DIRS "${PROJECT_EXTERNAL_DIR}/include/external/WebView2")
set(webview2_LIBS "${PROJECT_EXTERNAL_DIR}/lib/external")
message(STATUS "wixlabrary_INCLUDE_DIRS is ${wixlabrary_INCLUDE_DIRS}")
message(STATUS "webview2_INCLUDE_DIRS is ${webview2_INCLUDE_DIRS}")
message(STATUS "webview2_LIBS is ${webview2_LIBS}")

#配置QT位置
message(STATUS "CMAKE_SYSTEM_NAME is ${CMAKE_SYSTEM_NAME}")
if (CMAKE_SYSTEM_NAME MATCHES "Windows")
    #下面是Windows下Qt的默认前缀
    set(CMAKE_PREFIX_PATH "D:/Library/Qt5.14.2/5.14.2/msvc2017_64/lib/cmake")
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" AND CMAKE_SYSTEM_NAME MATCHES "Linux")
    #下面是aarch64 Linux下Qt的默认前缀
    set(CMAKE_PREFIX_PATH /opt/Qt5.14.2_aarch64/)
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux")
    #下面是Linux x64下Qt的默认前缀
    set(CMAKE_PREFIX_PATH /opt/Qt5.14.2/5.14.2/gcc_64)
endif ()
message(STATUS "====================set_env.cmake end===================")

base/init_project.cmake

# 查找QT的模块
find_package(Qt5 COMPONENTS
        Core
        Gui
        Widgets
        REQUIRED)

#加载webview2依赖的头文件
include_directories(SYSTEM ${wixlabrary_INCLUDE_DIRS} ${webview2_INCLUDE_DIRS})

#设置要搜索库文件的路径
link_directories(${webview2_LIBS})

# 把目录Packages/MainFrame/src下面的所有文件作为变量存储
aux_source_directory(Packages/MainFrame/src SOURCES)
# 添加源文件
add_executable(uChangAnSoftware ${SOURCES})

# 添加模块
target_link_libraries(uChangAnSoftware
        Qt5::Core
        Qt5::Gui
        Qt5::Widgets
        WebView2LoaderStatic
)

set_compile_arg.cmake

# 默认的编译配置(可选)
if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
    set(DEBUG_SUFFIX)
    if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
        set(DEBUG_SUFFIX "d")
    endif ()
    set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")
    if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
        set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
            set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        endif ()
    endif ()
    if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E make_directory
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
    endif ()
    foreach (QT_LIB Core Gui Widgets)
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/bin/Qt5${QT_LIB}${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>")
    endforeach (QT_LIB)
endif ()

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

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

相关文章

IP 地址查询,快速查询自己的 IP 地址

文章目录 在线结果 在线 http://myip.top/ 结果

c++ queue 的使用

目录 1. 默认构造函数 2. void push(const T& x) 3. void pop() 4. T& front() 5. T& back() 6. bool empty() 7. size_t size() 下面是 queue 的简介&#xff0c;来自 queue - C Reference (cplusplus.com) 的中文翻译&#xff0c;看看就行了&#xff…

使用Node.js软件包管理器(npm)安装TypeScript

安装node.js node.js的安装很简单&#xff0c;这里不再赘述&#xff0c;如果大家有需要&#xff0c;可以看一下这个&#xff1a;https://blog.csdn.net/David_house/article/details/123218488 检验电脑上node.js是否安装成功&#xff0c;或者是否已经安装node.js&#xff0c…

22款奔驰GLE450升级香氛负离子 清新淡雅

香氛负离子系统是由香氛系统和负离子发生器组成的一套配置&#xff0c;也可以单独加装香氛系统或者是负离子发生器&#xff0c;香氛的主要作用就是通过香氛外壳吸收原厂的香水再通过空调管输送到内饰中&#xff0c;而负离子的作用就是安装在空气管中通过释放电离子来打击空气中…

11月14号|Move生态Meetup相约浪漫土耳其

Move是基于Rust编程语言&#xff0c;由Mysten Labs联合创始人兼CTO Sam Blackshear在Meta的Libra项目中开发而来&#xff0c;旨在为开发者提供比现有区块链语言更通用的开发语言。Sam的目标是创建Web3的JavaScript&#xff0c;即一种跨平台语言&#xff0c;使开发人员能够在多个…

Java NIO 开发

Java NIO 新篇介绍加示例代码 Java NIO&#xff08;New IO&#xff09;是 JDK 1.4 引入的一组新的 I/O API&#xff0c;用于支持非阻塞式 I/O 操作。相比传统的 Java IO API&#xff0c;NIO 提供了更快、更灵活的 I/O 操作方式&#xff0c;可以用于构建高性能网络应用程序。 Ja…

电机控制方案汇总

以IR2104/IR2184为例&#xff08;第1讲&#xff09; NXP智能车永磁直流有刷电动机驱动器 (1)BTN7971B BTN7970 BTN7960 半桥 两片芯片即可驱动一个电机。好用 有个队有KEA128例程 (2)HIP4082 全桥 一片芯片4个MOS驱动一个电机。 好用 (3)IR2184 半桥 两片芯片4个MOS驱动一个电机…

Linux系统启动异常完整修复过程

当Linux启动时出现报错提示“Give root password for maintenance”&#xff0c;表明系统检测到某些系统文件可能损坏或丢失&#xff0c;因此需要进入维护模式来修复。此时&#xff0c;需要输入root用户的密码才能进入维护模式&#xff0c;以修复损坏的文件。 Linux系统无法正常…

MyBaties存储和查询json格式的数据(实体存储查询版本)

最近在做的功能&#xff0c;由于别的数据库有值&#xff0c;需要这边的不同入口的进来查询&#xff0c;所以需要同步过来&#xff0c;如果再继续一个一个生成列对应处理感觉不方便&#xff0c;如果没有别的操作&#xff0c;只是存储和查询&#xff0c;那就可以用MySql支持的jso…

数字孪生技术:智慧港口的未来

随着全球贸易的不断增长&#xff0c;港口运营已经成为国际贸易的重要枢纽。港口管理者和运营商正面临着巨大的挑战&#xff0c;需要应对日益复杂的物流网络、安全威胁、环境可持续性和客户需求。在这个背景下&#xff0c;数字孪生技术已经崭露头角&#xff0c;为智慧港口的建设…

安装sharepoint订阅版过程

一、安装需求 1、计算资源需求 CPU 4核&#xff0c;内存24G以上&#xff0c;硬盘300G 2、操作系统 Windows Server 2019 标准或数据中心 Windows Server 2022 标准或数据中心 3、数据库 支持数据库兼容性级别 150 的SQL Server 2019 或更高版本SQL Server 2022&#xf…

windows qemu安装飞腾Aarch64 操作系统 亲测

在win7&#xff08;X86架构CPU&#xff09;下使用QEMU虚拟机运行银河麒麟操作系统&#xff08;ARM架构CPU&#xff09; 1、下载并安装QEMU虚拟机软件 https://qemu.weilnetz.de/w64/2020/ 2、准备好ARM银河麒麟操作系统.iso文件 这里是 Kylin-Desktop-V10-Release-2107-ar…

MySQL主从同步-Gtid

【百炼成魔】MySQL主从同步-Gtid 服务器准备 IP节点配置系统版本191.168.117.143master2c2g40gcentos 7.9192.168.117.142slave2c2g40gcentos 7.9 环境准备 下面操作需要在两台机器都操作 关闭防火墙 systemctl stop firewalld && systemctl disable firewalldse…

如何写考勤分析报告?

如何写考勤分析报告&#xff1f;首先你得知道考勤分析报告需要分析哪些数据。 一般来说&#xff0c;一份完整的考勤分析报告&#xff0c;必须要分析的数据有8大类—— 基本考勤数据出勤数据加班数据迟到早退数据请假数据休息日和节假日数据打卡数据异常情况数据 除此之外还需…

lesson-2C++类与对象(中)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 类的6个默认成员函数 构造函数 概念 特性 析构函数 概念 特性 拷贝构造函数 概念 特性 赋值运算符重载 运算符重载 赋值运算符重载 前置和后置重载 日期类的实现 类的6个默认成员函数 如果一个类中什么…

基于java jsp垃圾分类管理系统的设计与实现

摘 要 我们的时代像一辆高速飞驰的列车&#xff0c;带着互联网冲入了我们的视野内&#xff0c;并且大家对生活品质的追求也更加地高了。花变成了人们生活中的一个常见品。鲜花的需求量在这些年来逐步增长&#xff0c;花本身就具有“高颜值”&#xff0c;还伴有特殊的香味&a…

内核进程的调度与进程切换

进程被创建到了链表中&#xff0c;如何再进行进一步的调用和调用&#xff1f; 进程调度 void schedule(void)&#xff1b; 进程调度 switch_to(next); 进程切换函数 void schedule(void) {int i,next,c;struct task_struct ** p;/* check alarm, wake up any i…

秒级启动的集成测试框架

本文介绍了一种秒级启动的集成测试框架&#xff0c;使用该框架可以方便的修改和完善测试用例&#xff0c;使得测试用例成为测试过程的产物。 背景 传统的单元测试&#xff0c;测试的范围往往非常有限&#xff0c;常常覆盖的是一些工具类、静态方法或者较为底层纯粹的类实现&…

群晖上搭建teamspeak3语音服务器

什么是 TeamSpeak &#xff1f; TeamSpeak &#xff08;简称 TS&#xff09;是一款团队语音通讯工具&#xff0c;但比一般的通讯工具具有更多的功能而且使用方便。它由服务器端程序和客户端程序两部分组成&#xff0c;如果不是想自己架设 TS 服务器&#xff0c;只需下载客户端程…

OpenCV学习(四)——轨迹栏(调色板与不同通道图像)

轨迹栏 4. OpenCV轨迹栏4.1 轨迹栏作为调色板4.2 轨迹栏显示不同通道图像 4. OpenCV轨迹栏 会用到以下主要两个函数 cv2.createTrackbar(trackbarName, windowName, value, count, onChange)创建轨迹栏 主要参数&#xff1a; trackbarName&#xff1a;轨迹栏名称windowName…