【cmake学习】搭建一个简单的cmake工程(优化版)

news2024/11/25 1:14:16

之前搭建了一个基本的cmake工程,仅使用了一个 CMakeLists.txt 文件来管理整个工程,实际上一个工程里可以包含多个 CMakeLists.txt 文件,这样做的目的是把引入所需文件、生成执行文件/库文件 这两个工作交由两个 CMakeLists.txt 分别实现。

【cmake学习】搭建一个简单的cmake工程(初级版)_仲夏夜之梦~的博客-CSDN博客【cmake学习】搭建一个简单的cmake工程(初级版)https://blog.csdn.net/challenglistic/article/details/130110539?spm=1001.2014.3001.5501

虽然是分多个 CMakeLists.txt 来实现,你可以认为最后cmake会把所有的 CMakeLists.txt 的内容整合到一起,所以某个 CMakeLists.txt 定义的属性或者变量依然可以在其他 CMakeLists.txt 使用。


目录

一、基本思路

二、编写 CMakeLists.txt

1、顶层 CMakeLists.txt

2、vac/CMakeLists.txt

3、vac/util/CMakeLists.txt

4、app1/CMakeLists.txt


一、基本思路

整个工程,大致可以分为三部分。与之前的工程相比,多出了几个 CMakeLists.txt 文件,每个CMakeLists.txt都有各自的作用。

第一部分是源文件,可以看做是当前工程的核心,用于生成执行文件或者库文件。

第二部分是第三方库,封装好的库文件可以直接供第一部分使用。

第三部分是工具库,将相关的函数封装成一个动态库,供第一部分使用。

二、编写 CMakeLists.txt

从上图中可以看到,出了最外层的 CMakeLists.txt,中间的一些子目录下也有 CMakeLists.txt,下面就按照图中的顺序,从外层到内层编写 CMakeLists.txt

1、顶层 CMakeLists.txt

该层的 CMakeLists.txt 主要作用是添加头文件或者库文件的搜索路径,也可以根据不同的环境设置对应的编译选项。

cmake_minimum_required(VERSION 3.0)

project(tool_test)

# 这里添加的头文件路径是全局的,即不光是app1目录下的文件可以使用,vac目录下的文件也可以使用
include_directories(${PROJECT_SOURCE_DIR}/3rd_part/include)

# 添加OpenCV库的搜索路径并引入OpenCV库
list(APPEND CMAKE_PREFIX_PATH /usr/local/opencv/build)
find_package(OpenCV REQUIRED)
if(OpenCV_FOUND)
    include_directories(${OpenCV_INCLUDE_DIRS})
endif()

# 告诉cmake,app1 和 vac 目录下也有CMakeLists.txt需要编译
add_subdirectory(app1)
add_subdirectory(vac)

2、vac/CMakeLists.txt

这一层的CMakeLists.txt没有什么特别的地方,只是告诉cmake,util目录下有CMakeLists.txt需要编译。

add_subdirectory(util)

3、vac/util/CMakeLists.txt

该层的CMakeLists.txt主要负责生成动态库供第一部分的源文件使用。这里可以自己选定动态库的输出位置,不指定的话,默认按照当前工程的层级构建输出路径,即放到 build/vac/util 目录下。

# 获取到当前目录下所有的 cpp 和 h 文件
file(GLOB ALL_SOURCES *.cpp *.c)
file(GLOB ALL_INCLUDES *.hpp *.h) 
set(ALL_SRCS
    ${ALL_SOURCES}
    ${ALL_INCLUDES}
)

# SHARED 表示生成动态库
add_library(mul SHARED ${ALL_SRCS})

# 将生成的动态库放到 ${PROJECT_SOURCE_DIR}/build/lib
set_target_properties(mul 
    PROPERTIES LIBRARY_OUTPUT_DIRECTORY 
    ${PROJECT_SOURCE_DIR}/build/lib
)

 

4、app1/CMakeLists.txt

该层的CMakeLists.txt主要是为了生成二进制可执行文件,这里使用的 mul 库就是上面 vac/util/CMakeLists.txt 所生成的动态库。这里同样可以指定可执行文件的输出路径,假设输出到 build/bin目录下。

# 获取到当前目录下所有的 cpp 和 h 文件
file(GLOB ALL_SOURCES *.cpp *.c)
file(GLOB ALL_INCLUDES *.hpp *.h) 
set(ALL_SRCS
    ${ALL_SOURCES}
    ${ALL_INCLUDES}
)

# 生成二进制可执行文件
add_executable(${PROJECT_NAME} ${ALL_SRCS})
# 链接库文件
target_link_libraries(${PROJECT_NAME} 
    mul
    ${OpenCV_LIBS}
)
# 指定二进制执行文件的输出路径
set_target_properties(${PROJECT_NAME} 
    PROPERTIES RUNTIME_OUTPUT_DIRECTORY 
    ${PROJECT_SOURCE_DIR}/build/bin
)

最终效果如下:

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

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

相关文章

接口自动化【一】(抓取后台登录接口+postman请求通过+requests请求通过+json字典区别)

文章目录 前言一、requests库的使用二、json和字典的区别三、后端登录接口-请求数据生成四、接口自动化-对应电商项目中的功能五、来自postman的代码-后端登录总结前言 记录:json和字典的区别,json和字段的相互转化;postman发送请求与Python…

Python:清华ChatGLM-6B中文对话模型部署

1、简介 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存&#xff0…

SpringBoot程序运行时动态修改主数据库配置(不需要改配置,不需要重启)

SpringBoot程序运行时修改主数据库配置(不需要改配置,不需要重启)搞事背景心路历程搞事背景 在面试某家单位的时候,碰到了一家单位线上考试,要求开发一个springboot后台。一眼看去都是正常的需求,突然我在…

Raft: 基于 Log 复制的共识算法

References Raft 演示 In Search of an Understandable Consensus Algorithm (Extended Version) 1. Raft 是什么 1.1 目标: 复制 Log 在讲解 Raft 协议的具体行为之前我们需要明白 Raft 的目标是什么?在一些情况下我们需要保证分布式集群中的机器拥有相同的数…

IOC容器——Bean

IOC容器——BeanBean配置name别名属性Bean作用范围scopeBean的实例化构造方法示例化静态工厂实例化实例工厂与FactoryBean实例工厂FactoryBeanbean的生命周期Bean配置 name别名属性 Bean ID 唯一,而关于Spring别名,我们可以在配置文件中使用name来定义&…

Google Play管理中心和ASO的重要性

Android Vitals 是我们应用优化的重要组成部分,能够显示应用的运行状况。一般来说,如果应用具有良好的体验,它会更容易在Google Play中被用户发现,从而获得更好的排名和更多的安装量。 从开发者的角度来看,Android Vi…

JAVA8新特性stream流收集为Map,value为null导致空指针的问题

jdk8 新特性stream深受喜爱&#xff0c;平时使用比较多&#xff0c;其中有&#xff1a; Map<String, String> collect2 list.stream().collect(Collectors.toMap(Book::getName, Book::getIdNO,(pre, after) -> pre)); 现象如下&#xff1a; package MainTest.str…

HTML5 <nav> 标签、HTML5 <noscript> 标签

HTML5 <nav> 标签 实例 HTML5 <nav>标签用于表示HTML页面中的导航&#xff0c;可以是页与页之间导航&#xff0c;也可以是页内的段与段之间导航。 一个导航链接实例&#xff1a; <nav> <a href"/html/">HTML</a> | <a href&qu…

关于pinduoduo开放接口测试

什么是接口测试 接口测试是测试系统组件间接口的一种方式&#xff0c;接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是检查数据的增删改查操作&#xff0c;以及系统之间的逻辑关系等。 接口测试作为集成测试的一部分&#xff0c;通过直接…

归并排序(非递归实现) 计数排序

上一期我们说了归并排序的递归是如何实现的&#xff0c;但是递归如果层次太多的话容易栈溢出&#xff0c;所以我们还需要掌握非递归的实现&#xff0c;但是我们非递归需要如何实现&#xff1f; 下面我们就来看一下非递归的实现 归并排序的非递归实现他并不需要栈队列这些东西…

No.042<软考>《(高项)备考大全》【第26章】法律法规(合同法、招投标法、政府采购法、著作权法)

【第26章】法律法规&#xff08;合同法、招投标法、政府采购法、著作权法&#xff09;1 考试相关2 合同法练习题参考答案3 招投标法3.1 法规时间总结3.2 招投标流程3.3 招标3.4 投标3.5 评标3.6 练习题参考答案3.7 论文写作3.8 投标文件的编写应该注意哪些事项4 著作权法4.1 练…

找漏洞赚外快?给ChatGPT挑毛病,最高奖励14万

反正闲着也是闲着&#xff0c;不如来给ChatGPT找漏洞&#xff1f;毕竟&#xff0c;万一真的找到漏洞了还能赚一笔外快。 当地时间 4 月 11 日&#xff0c;OpenAI 宣布推出漏洞赏金计划。该公司将根据报告问题的严重性和影响提供现金奖励&#xff0c;奖励范围从 200 美元到 200…

Spring经典扩展接口应用:BeanPostProcessor

备注&#xff1a;新进行基本思路总结&#xff0c;四五月总结完 一、BeanPostProcessor基本知识总结 BeanPostProcessor是Bean级处理器&#xff0c;用于在bean实例化后、初始化后自定义修改bean实例&#xff0c;如属性校验、针对自定义bean做统一处理等。 BeanPostProcessor接…

实战:向人工智能看齐用Docker部署一个ChatGPT

文章目录前言鉴赏chatgpt环境要求开始搭建云安装docker从docker仓库拉取chatgpt-web镜像创建容器并运行chatgpt-web创建容器启动chatgpt-web访问自己的chatgpt总结前言 目前GPT-4都官宣步入多模态大型语言模型领域了&#xff0c;大佬竟然还没有体验GPT么。作为一个资深搬砖人士…

容器编排部署

一、概述 容器编排部署的作用&#xff1a; 实现复杂容器应用架构之间的互联&#xff0c;减少大量容器部署的成本 Docker"三剑客"编排部署 工具︰ docker machine 用于创建和管理docker host docker compose 通过一个文件定义复杂的容器应用之间的关系 容器与容…

【FMCW系统性能参数之测量精度公式推导】

本文编辑&#xff1a;调皮哥的小助理 连续多篇文章都在说FMCW雷达系统性能参数这个事儿&#xff0c;如&#xff1a; &#xff08;1&#xff09;从奈奎斯特采样定理推导FMCW雷达系统性能参数 &#xff08;2&#xff09;从FMCW毫米波雷达系统的性能参数理解4D成像毫米波雷达的设…

深度学习语义分割篇——FCN原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;往期回顾&#xff1a;目标检测系列——开山之作RCNN原理详解    目标检测系列——Fast R-CNN原理详解    目标检测系列——Faster R-CNN原理详解 &#x1f34a;近期目标&…

Unity --- 3d数学 --- 坐标系统

1.世界坐标系是固定不动的 2.每一个游戏物体在世界坐标系中都有对应的坐标和方向 1.轴心点的位置不是固定的&#xff0c;是可以人为设定的 1.Screen Space --- 屏幕坐标 2.我们看到的屏幕其实就是相机所在的平面的位置 --- 而屏幕坐标系的Z其实就是游戏中的物体到相机平面的…

GDOUCTF

WEB hate eat snake 这是一个JS的题目&#xff0c;但是这个题目好像有点奇怪&#xff0c;不是很理解&#xff0c;当时我找到了我寝室JS的大哥&#xff0c;跟大哥说了一下我的思路&#xff0c;就是他根据这个time然后/1000转化为秒&#xff0c;就当作是我们玩游戏的一个分数&a…

速卖通韩国下载量再次登顶,7500万投资换来回报

韩国市场&#xff0c;还是一片蓝海。 速卖通终于等到了回报。 近日&#xff0c;数据平台 Data ai 显示&#xff0c;3 月 9 日以来&#xff0c;速卖通再次成为韩国购物 App 下载量第一名&#xff0c;超过当地电商平台 Coupang。 这或许和速卖通近日在韩国的布局有关。 前些天…