CMake:嵌套的CMake与多级项目管理(八)

1、嵌套的CMake

如果项目很大或者项目中有很多的源码目录,在通过CMake管理项目的时候如果只使用一个CMakeLists.txt,那么这个文件会相对比较复杂,有一种化繁为简的方式就是给每个源代码目录都添加一个CMakeLists.txt文件(头文件不需要),这样每个文件都不会太复杂,而且更灵活,更容易维护。

.
├── calc
│   ├── add.cpp
│   ├── CMakeLists.txt
│   ├── dived.cpp
│   ├── mul.cpp
│   └── sub.cpp
├── inc
│   ├── calc.h
│   └── sort.h
├── sort
│   ├── CMakeLists.txt
│   ├── insert.cpp
│   └── select.cpp
├── test1
│   ├── calc.cpp
│   └── CMakeLists.txt
└── test2
│   ├── CMakeLists.txt
│   └── sort.cpp
├── CMakeLists.txt
  • calc目录:目录中的四个源文件对应加、减、乘、除算法
    • 对应的头文件是inc中的calc.h
  • inc目录:所有头文件存放目录
  • sort目录:目录中的两个源文件分别是插入和选择排序算法
    • 对应的头文件inc中的sort.h
  • test1目录:测试目录,对加减乘除算法进行测试
  • test2目录:测试目录,对排序算法进行测试

可以看到各个源文件目录所需要的CMakeLists.txt文件现在已经添加完毕了。接下来可以依次分析一下各个文件中需要添加的内容

2、具体流程
2.1、节点关系

Linux中的目录是一个梳妆结构,所以嵌套的CMake也是一个梳妆结构,最顶层的CMakeLists.txt是根节点,其次都是子节点。对于父子CMakeLists.txt文件变量作用域存在一些关系

  • 根节点CMakeLists.txt中的变量全局有效
  • 根节点CMakeLists.txt中的变量可以在子节点中使用
  • 子节点CMakeLists.txt中的变量只能在当前节点中使用

对于多级子目录的项目需要再根节点CMakeLists.txt中使用CMake的命令

# 添加子节点目录
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
  • source_dir:指定了CMakeLists.txt源代码和代码文件的位置,其实就是指定子目录
  • binary_dir:指定了输出文件的路径,一般不需要指定,忽略即可。
  • EXCLUDE_FROM_ALL:在子路径下的目录默认不会被包含到父路径ALL目标里,并且也会被排除在IDE工程文件之外。用户必须显示构建在子路径下的目标
2.2、具体实现
2.2.1、根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.10.2)
set(CMAKE_CXX_STANDARD 14)# 主项目名称
project(main_project)
# 静态库生成的路径
set(LIBPATH ${PROJECT_SOURCE_DIR}/lib)
# 可执行程序的存储目录
set(EXECPATH ${PROJECT_SOURCE_DIR}/bin)
# 头文件目录
set(HEADPATH ${PROJECT_SOURCE_DIR}/inc)# 库文件的名字
set(CALCLIB calc)
set(SORTLIB sort)# 可执行程序的名字
set(EXECNAME1 main1)
set(EXECNAME2 main2)# 添加子节点目录
# add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
add_subdirectory(calc)
add_subdirectory(sort)
add_subdirectory(test1)
add_subdirectory(test2)
  • 根节点下的CMakeLists.txt文件中定义了一系列的可能用到的全局变量的值
  • 添加子节点目录进行引用
2.2.2、calc目录CMakeLists.txt

calc目录下的源代码打包生成一个静态库文件,并且存放到指定的目录下

cmake_minimum_required(VERSION 3.10.2)
project(calc)# 搜索源文件
aux_source_directory(./ src_list)
# 添加头文件
include_directories(${HEADPATH})
# 设置库文件存储的位置
set(LIBRARY_OUTPUT_PATH ${LIBPATH})
# 制作静态库文件
add_library(${CALCLIB} STATIC ${src_list})
  • aux_source_directory:搜索当前目录下的所有.cpp源代码
  • include_directories:指定头文件,具体的值从父节点的全局变量中获取
  • set(LIBRARY_OUTPUT_PATH ${LIBPATH}):指定静态库存储的位置
  • add_library(${CALCLIB} STATIC ${src_list}):制作一个静态库,并且指定名称和源文件列表
2.2.3、sort目录CMakeLists.txt

sort目录下的源代码打包生成一个动态库文件,并且存放到指定的目录下

cmake_minimum_required(VERSION 3.10.2)
project(sort)# 搜索源文件
file(GLOB src_list ./*.cpp)
# 添加头文件
include_directories(${HEADPATH})
# 设置库文件存储的位置
set(LIBRARY_OUTPUT_PATH ${LIBPATH})
# 制作动态库文件
add_library(${SORTLIB} SHARED ${src_list})
2.2.4、test1目录CMakeLists.txt

用于生成测试静态库calc的可执行程序

cmake_minimum_required(VERSION 3.10.2)
project(test1)# 搜索源代码
file(GLOB main ./*.cpp)
# 指定头文件
include_directories(${HEADPATH})
# 链接静态库
link_libraries(${CALCLIB})
# 指定静态库的路径
link_directories(${LIBPATH})# 指定可执行程序存放的位置
set(EXECUTABLE_OUTPUT_PATH ${EXECPATH})# 生成可执行程序
add_executable(${EXECNAME1} ${main})
  • include_directories(${HEADPATH}):指定头文件的目录,对应Makefile中的-I(大写i)
  • link_libraries(${CALCLIB}):指定需要链接静态库的名称,对应Makefile中的-l(小写L)
  • link_directories(${LIBPATH}):指定需要链接静态库的路径,对应Makefile中的-L(大写L)
2.2.5、test2目录CMakeLists.txt

用于生成测试动态库sort的可执行程序

cmake_minimum_required(VERSION 3.10.2)
project(test2)# 搜索源文件
aux_source_directory(./ main)
# 设置可执行程序输出位置
set(EXECUTABLE_OUTPUT_PATH ${EXECPATH})# 包含头文件
include_directories(${HEADPATH})
# 生成可执行程序
add_executable(${EXECNAME2} ${main})# 链接动态库
link_directories(${LIBPATH})
target_link_libraries(${EXECNAME2} ${SORTLIB})
  • include_directories(${HEADPATH}):指定头文件的目录,对应Makefile中的-I(大写i)
  • link_directories(${LIBPATH}):指定需要链接动态库的路径,对应Makefile中的-L(大写L)
  • target_link_libraries(${EXECNAME2} ${SORTLIB}):可执行程序链接动态库libsort.so

在这里插入图片描述

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

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

相关文章

Debian操作系统的常用指令介绍

Debian是一个流行的Linux操作系统,以其稳定性和安全性而闻名。对于Debian用户来说,掌握一些基本的命令行指令是非常重要的,因为它们可以帮助你更高效地管理系统。在这篇博客中,我们将介绍一些在Debian系统中常用的指令及其功能。 …

远程桌面报错:【出现验证错误。要求的函数不受支持】

WinR 输入【gpedit.msc】回车 依次打开 计算机配置----管理模板-----系统-----凭据分配---加密数据库修正 选择【已启用】,下拉菜单选择【易受攻击】

24.5.2数据结构|顺序表实现

主要是记笔记,留着以后复习回来看的,有些内容解释的并不清晰。也就稍微可以借鉴借鉴。 一、如何定义结构? 应该有的部分用来约束的部分 二、看书搞清楚顺序表实现流程 1、准备工作:如何定义结构体?SeqList&#xf…

每日一题(力扣213):打家劫舍2--dp+分治

与打家劫舍1不同的是它最后一个和第一个会相邻,事实上,从结果思考,最后只会有三种:1 第一家不被抢 最后一家被抢 2 第一家被抢 最后一家不被抢 3 第一和最后一家都不被抢 。那么,根据打家劫舍1中的算法 我们能算出在i…

【Java笔记】第5章:函数

前言1. 函数的理解2. 函数的基本使用3. 函数的参数4. 函数的返回值5. 函数的执行机制6. 函数的递归调用结语 ↓ 上期回顾: 【Java笔记】第4章:深入学习循环结构 个人主页:C_GUIQU 归属专栏:【Java学习】 ↑ 前言 各位小伙伴大家好&#xff…

java递归-(迷宫问题)

前面 这里我们来玩个有趣的事情,链接是0221_韩顺平Java_老鼠出迷宫1_哔哩哔哩_bilibili 我们要找的是小老鼠按路径走到右下点 要点 我们这里方法调用时对于引用类型:如java中引用数据类型有哪些?_java引用数据类型-CSDN博客 会共享引用类型…

浏览器安装路径位置的查看、指定网址快捷方式的创建

浏览器安装路径位置的查看、指定网址快捷方式的创建 浏览器安装路径位置的查看 法一、属性查看法 右键点击浏览器的桌面图标,选择“属性”,“快捷方式”页中的“目标”框中可见. 以Microsoft Edge浏览器为例,参见下图: 法二、地…

电商核心技术揭秘四十三:电商平台营销策略浅析(下)

相关系列文章 电商技术揭秘相关系列文章合集(1) 电商技术揭秘相关系列文章合集(2) 电商技术揭秘相关系列文章合集(3) 电商技术揭秘四十一:电商平台的营销系统浅析 电商技术揭秘四十二&#…

CTF-WEB(MISC)

安全攻防知识——CTF之MISC - 知乎 CTF之MISC杂项从入门到放弃_ctf杂项 你的名字-CSDN博客 CTF MICS笔记总结_archpr 掩码攻击-CSDN博客 一、图片隐写 CTF杂项---文件类型识别、分离、合并、隐写_ctf图片分离-CSDN博客 EXIF(Exchangeable Image File)是…

Nacos单机模式集成MySQL

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Nacos支持三种部署…

Uniapp好看登录注册页面

个人介绍 hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的…

富文本编辑器CKEditor4简单使用-08(段落首行缩进插件 + 处理粘贴 Microsoft Word 中的内容后保持原始内容格式(包括首行缩进))

富文本编辑器CKEditor4简单使用-08(段落首行缩进插件 处理粘贴 Microsoft Word 中的内容后保持原始内容格式(包括首行缩进)) 1. 缩进,特殊方式处理——修改原工具栏里的增加缩进量2 缩进,插件处理——不含…

Redis协议与异步方式

Rredis Pipeline redis pipeline 是一个客户端提供的机制,而不是服务端提供的; pipeline 不具备事务性; 目的:节约网络传输时间; 通过一次发送多次请求命令,从而减少网络传输的时间。 Redis发布订阅 为了支…

使用jdbc方式操作ClickHouse

1、创建测试表,和插入测试数据 create table t_order01(id UInt32,sku_id String,total_amount Decimal(16,2),create_time Datetime ) engine MergeTreepartition by toYYYYMMDD(create_time)primary key (id)order by (id,sku_id);insert into t_order01 values …

【Vue】结合ElementUI实现简单数据请求和页面跳转功能

一、准备工作 1、创建一个Vue-cli程序 之前的博客有。各位看官姥爷,可以自查。 2、安装ElementUI 在创建Vue-cli程序的过程中,需要在控制台执行以下指令: #安装 element-ui npm i element-ui -S #安装 SASS 加载器 cnpm install sass-loa…

echarts 拖动markline,并计算中间区域的差值,标注红色虚线

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><!-- 引入 echarts.js --><script src"https://cdn.bootcdn.net/ajax/libs/echarts/4.8.0/echarts-en.common.js" rel"external nof…

Linux 学习 --- 编辑 vi 命令

1、vi 基本概念&#xff08;了解&#xff09; 基本上 vi 可以分为三种状态&#xff0c;分别是命令模式 (command mode)、插入模式 (Insert mode) 和底行模式 (last line mode)&#xff0c;各模式的功能区分如下: 命令行模式 command mode&#xff09;  控制屏幕光标的移动&a…

工业项目组态用这个开源软件ScadaBR

软件介绍 ScadaBR 是一个开源软件&#xff0c;提供完整的 SCADA&#xff08;Supervisory Control and Data Acquisition&#xff0c;监控与数据采集&#xff09;系统的所有功能。SCADA 类型的软件自60年代末开始存在&#xff0c;并且在涉及机器、可编程逻辑控制器&#xff08;P…

ssh远程访问windows系统下的jupyterlab

网上配置这一堆那一堆&#xff0c;特别乱&#xff0c;找了好久整理后发在这里 由于既想打游戏又想做深度学习&#xff0c;不舍得显卡性能白白消耗&#xff0c;这里尝试使用笔记本连接主机 OpenSSH 最初是为 Linux 系统开发的&#xff0c;现在也支持包括 Windows 和 macOS 在内…

《R语言与农业数据统计分析及建模》学习——数字图像处理

数字图像处理&#xff08;digital image processing&#xff09;又称计算机图像处理&#xff0c;它是指将图像信号转换成数字信号并利用数字图像处理计算机对其进行处理的过程。 常见的数字图像处理是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理。 R语言…