如何在CMakeList项目中集成GNU Autotools 构建模块

背景:

我有三个工具A,B,C,其中A,B是原先MakeFile编译的工具,C是原先GNU Auto tools自动编译的工具。现在希望使用CMakeList统一构建,我的目录如下:
|
|–A
|-----/src
|-----CMakeList.txt
|–B
|-----/src
|-----CMakeList.txt
|–C
|----- autoTool
|–CMakeList.txt

想要起到的效果是我在根目录下:

mkdir build
cd build
cmake ..
make 
make install

就能生成A, B,C的可执行文件,并安装到/usr/local/bin中。

方案:

对于最外层根目录的CMakeList,我们引入AB的目录,并引入C自由编译的插件。
下面展示一些 内联代码片



cmake_minimum_required(VERSION 3.10)# 项目名称
project(tools VERSION 1.0)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)#引入AB 子模块
add_subdirectory(A)
add_subdirectory(B)#设置C子模块目录
set(CDir ${CMAKE_SOURCE_DIR}/)include(ExternalProject)ExternalProject_Add(SOURCE_DIR ${CDir} # 指定 C子目录CONFIGURE_COMMAND cd  ${CDir} && autoreconf -fv --install && ./configure BUILD_COMMAND cd  ${CDir} && makeINSTALL_COMMAND cd  ${CDir} && make install
)# 将 C的可执行文件安装到 bin 目录,这里第一个C是目录名,第二个C是可执行文件名。
install(PROGRAMS ${CMAKE_SOURCE_DIR}//C DESTINATION /usr/local/bin)

A目录下的CMakeList.txt:
下面展示一些 内联代码片


cmake_minimum_required(VERSION 3.10)# 项目名称和版本
project(A VERSION 1.0)# 设置 C 编译器
set(CMAKE_C_COMPILER gcc)# 编译选项
set(CMAKE_C_FLAGS "-O3 -Wall -Wno-unused-but-set-variable -DVERSION=\\\"${PROJECT_VERSION}\\\"")# 可执行文件名称
set(EXEC_NAME A)# 设置源文件目录
set(A_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
set(A_HEADER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)# 源文件列表
set(SOURCES
${A_SOURCE_DIR}/example1.c
${A_SOURCE_DIR}/example2.c
)set(HEADERS
${A_HEADER_DIR}/example1.h
${A_HEADER_DIR}/example2.h
)# 生成可执行文件
add_executable(${EXEC_NAME} ${SOURCES})# 指定头文件目录
target_include_directories(${EXEC_NAME} PRIVATE ${A_HEADER_DIR})# 安装规则 (用于 `make install`)
install(TARGETS ${EXEC_NAME} DESTINATION /usr/local/bin)

B目录下的CMakeList.txt同理。

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

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

相关文章

AI学习指南深度学习篇-丢弃法的实现机制

AI学习指南深度学习篇 - 丢弃法的实现机制 在深度学习的模型训练过程中,过拟合是一个常见的问题。为了减少过拟合,提升模型的泛化能力,研究者们提出了多种正则化技术,其中最为人知的就是“丢弃法”(Dropout&#xff0…

【中级通信工程师】终端与业务(三):电信业务

【零基础3天通关中级通信工程师】 终端与业务(三):电信业务 本文是中级通信工程师考试《终端与业务》科目第三章《电信业务》的复习资料和真题汇总。终端与业务是通信考试里最简单的科目,有效复习通过率可达90%以上,本文结合了高频考点和近几…

SQL 性能调优

什么是 SQL 性能调优 SQL 性能调优是优化 SQL 查询以尽可能高效地运行的过程,从而减少数据库负载并提高整体系统性能。这是通过各种技术实现的,例如分析查询执行计划、优化索引和重写查询以确保最佳执行路径。目标是最大限度地减少执行查询所需的时间和…

Windows安装openssl开发库

1 下载openssl安装包并安装 下载网址: https://slproweb.com/products/Win32OpenSSL.html 下载对应的安装版本。 双击安装包,一路下一步完成安装。注意:1.安装路径不要有空格; 2. 建议不要把DLL拷贝到系统路径。 2 编辑代码 …

什么是Node.js?

为什么JavaScript可以在浏览器中被执行? 在浏览器中我们加载了一些待执行JS代码,这些字符串要当中一个代码去执行,是因为浏览器中有JavaScript的解析引擎,它的存在我们的代码才能被执行。 不同的浏览器使用不同的javaScript解析引…

数据结构之链表(1),单链表

目录 前言 一、什么是链表 二、链表的分类 三、单链表 四、单链表的实现 五、SList.c文件完整代码 六、使用演示 总结 前言 本文讲述了什么是链表,以及实现了完整的单链表。 ❤️感谢支持,点赞关注不迷路❤️ 一、什么是链表 1.概念 概念:链…

19、网络安全合规复盘

数据来源:5.网络安全合规复盘_哔哩哔哩_bilibili

C++—单例设计模式

单例设计模式 C中的单例设计模式是一种常用的软件设计模式,其核心目的是确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。以下是对C单例设计模式的详细解释: 一、单例设计模式的定义 单例模式(Singleton Pattern&…

精密制造的革新:光谱共焦传感器与工业视觉相机的融合

在现代精密制造领域,对微小尺寸、高精度产品的检测需求日益迫切。光谱共焦传感器凭借其非接触、高精度测量特性脱颖而出,而工业视觉相机则以其高分辨率、实时成像能力著称。两者的融合,不仅解决了传统检测方式在微米级别测量上的局限&#xf…

【C++】入门基础知识-1

🍬个人主页:Yanni.— 🌈数据结构:Data Structure.​​​​​​ 🎂C语言笔记:C Language Notes 🏀OJ题分享: Topic Sharing 目录 前言: C关键字 命名空间 命名空间介…

使用 Llama-index 实现的 Agentic RAG-Router Query Engine

前言 你是否也厌倦了我在博文中经常提到的老式 RAG(Retrieval Augmented Generation | 检索增强生成) 系统?反正我是对此感到厌倦了。但我们可以做一些有趣的事情,让它更上一层楼。接下来就跟我一起将 agents 概念引入传统的 RAG 工作流,重新…

凌晨1点开播!Meta Connect 2024开发者大会,聚焦Llama新场景和AR眼镜

作者:十九 编辑:李宝珠 北京时间 9 月 26 日凌晨 1 点,Meta Connect 2024 开发者大会即将举行,马克扎克伯格将聚焦 AI 和元宇宙,向大家分享 Llama 模型的更多潜在应用,并介绍 Meta 最新产品 AR 眼镜和 Meta…

OceanBase云数据库战略实施两年,受零售、支付、制造行业青睐

2022年OceanBase推出云数据库产品OB Cloud,正式启动云数据库战略。两年来OB Cloud发展情况如何,9月26日,OceanBase公有云事业部总经理尹博学向记者作了介绍。 尹博学表示,OB Cloud推出两年以来,已服务超过700家客户,客…

Pydantic 是一个强大的 Python 库

Pydantic 是一个强大的 Python 库,专门用于数据验证和设置管理。以下是对 Pydantic 的详细介绍: 一、主要功能和特点 数据验证: Pydantic 通过 Python 类型注解来定义数据模型,并自动验证输入数据是否符合预定义的类型和结构。提…

智算中心动环监控:构建高效、安全的数字基础设施@卓振思众

在当今快速发展的数字经济时代,智算中心作为人工智能和大数据技术的核心支撑设施,正日益成为各行业实现智能化转型的重要基石。为了确保这些高性能计算环境的安全与稳定,卓振思众动环监控应运而生,成为智算中心管理的重要组成部分…

计算机知识科普问答--19(91-95)

文章目录 91、为什么会产生死锁?什么是死锁?死锁产生的四个必要条件信号量机制中的死锁原因示例:可能导致死锁的信号量使用如何避免死锁在之前的信号量问题中如何避免死锁【2011年408真题】银行系统示例缓冲区问题示例具体示例:避免死锁的代码设计顾客进程 \( P_{\text{cus…

理解Java引用数据类型(数组、String)传参机制的一个例子

目录 理解Java引用数据类型(数组、String)传参机制的一个例子理解样例代码输出 参考资料 理解Java引用数据类型(数组、String)传参机制的一个例子 理解 引用数据类型传递的是地址。用引用类型A给引用类型B赋值,相当于…

[半导体检测-5]:软件离线许可(License)的基本原理

目录 前言: 一、软件离线许可的基本概念 二、实现原理 1. 数字签名技术 2. 授权信息包含内容 3. 时间戳验证 三、实际应用与操作建议 1. 离线许可的分配与安装 2. 常见问题与解决方法 四、总结 前言: 在软件行业,离线许可&#xf…

【自动驾驶】ros如何隔绝局域网内其他电脑播包

1.问题 可能碰到自己播包的时候,别人播包的传到我们电脑上,导致无法分析问题,或者出现一些奇怪的现象。 2.解决 export ROS_LOCALHOST_ONLY1 在终端加上这句话,或者在~/.bashrc中添加,通过source ~/.bashrc使其生…

Java 入门指南:获取对象的内存地址

文章目录 hashCode()应用重写 hashCode() 方法示例 Symstem . indentityHashCode()应用 注意事项 在 Java 开发中,了解对象的内存管理是十分重要的,尽管 Java 的设计初衷是让开发者更专注于业务逻辑而非底层资源管理。但在某些情况下,了解对象…