使用CMake调用Makefile 项目
目录标题
- 基本示例
- Cmake传递lib给Makefile
- Cmake传递参数给Makefile,比如make clean
- Windows下使用Cmake调用Makefile
基本示例
如果项目是使用传统的Makefile构建的,并且您希望使用CMake调用这些Makefile,您可以使用CMake的add_custom_target
和add_custom_command
命令来实现。
首先,创建一个CMakeLists.txt文件。然后,在其中使用add_custom_target
和add_custom_command
来调用您的原始Makefile。
现在用一共示例来说明,假如有以下的项目结构
project/
├── build/
├── CMakeLists.txt
├── Makefile
└── src/├── Makefile└── main.cc
这是一个简单的项目,其中src
目录包含一个main.cc
文件。接下来,我们需要编写两个Makefile。
-
在项目的根目录下创建一个Makefile:
在项目的根目录下的Makefile中,您可以使用
$(MAKE)
命令来调用src
目录下的Makefile。:# project/Makefile.PHONY: allall: build_src_makefilebuild_src_makefile:$(MAKE) -C srcclean:$(MAKE) -C src clean
这个Makefile现在定义了两个目标:
all
和clean
。all
目标依赖于build_src_makefile
目标,当您在顶层目录中运行make
或make all
时,它会调用src
目录下的Makefile来构建项目。同样,clean
目标会调用src
目录下的Makefile中的clean
目标来清理构建产物。 -
在
src
目录下创建另一个Makefile:# project/src/MakefileCC = g++ CFLAGS = -Wall -std=c++11TARGET = main SOURCES = main.ccall: $(TARGET)$(TARGET): $(SOURCES)$(CC) $(CFLAGS) $(SOURCES) -o $(TARGET)clean:rm -f $(TARGET)
此Makefile负责编译
main.cc
并生成一个名为main
的可执行文件。 -
创建一个简单的
main.cc
文件:// project/src/main.cc#include <iostream>int main() {std::cout << "Hello, world!" << std::endl;return 0; }
-
确保项目根目录下的CMakeLists.txt文件包含以下内容:
cmake_minimum_required(VERSION 3.10)project(MyProject)add_custom_target(build_top_level_makefileCOMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})add_custom_target(build_src_makefileCOMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/srcWORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src)
-
切换到
build
目录,并运行cmake
:cd build cmake ..
这将在
build
目录下生成CMake的Makefile。 -
在
build
目录下运行make
:make build_top_level_makefile
或者直接运行:
make build_src_makefile
这将使用
src
目录下的Makefile构建项目。 -
运行生成的可执行文件:
../src/main
Cmake传递lib给Makefile
将CMake引用的库连接到调用的Makefile中需要手动处理一些细节,但这是可行的。以下是一种可能的方法:
- 在您的CMakeLists.txt中,找到和引用的库相关的信息,包括库文件的路径和链接选项。例如,如果您使用
find_package
和target_link_libraries
来引用库,那么您需要找到这些库的路径和链接选项。 - 创建一个新的Makefile变量,用于传递库信息给被调用的Makefile。例如,您可以创建一个名为
LIBS
的变量,并将CMake找到的库信息赋值给它。 - 修改被调用的Makefile,使其能够接收并使用从CMake传递的库信息。在Makefile中,您需要使用
$(LIBS)
变量来添加库链接选项。
例如,您的CMakeLists.txt文件可能如下所示:
cmake_minimum_required(VERSION 3.10)
project(MyProject)# Find your libraries using find_package or other methods
find_package(YourLibrary REQUIRED)# ...add_custom_target(build_with_libsCOMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR} LIBS="${YourLibrary_LIBRARIES}"WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
接下来,修改您的Makefile,以便它能够接收和使用LIBS
变量。例如:
# Your original Makefile content# Add the library information passed from CMake
LDFLAGS += $(LIBS)# ...
这样,当您通过CMake调用Makefile时,CMake找到的库信息将被传递给Makefile,并用于链接过程。
Cmake传递参数给Makefile,比如make clean
CMake可以通过add_custom_target
和add_custom_command
传递Makefile的其他参数。例如,要实现make clean
,您可以在CMakeLists.txt中添加一个自定义目标,该目标调用被传递参数的Makefile。
以下是一个在CMakeLists.txt中添加make clean
自定义目标的示例:
cmake_minimum_required(VERSION 3.10)
project(MyProject)# ...add_custom_target(clean_makefileCOMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR} cleanWORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
这将创建一个名为clean_makefile
的自定义目标,当您调用cmake --build . --target clean_makefile
时,它将在CMake当前源目录中执行make clean
。
同样,您可以将任何其他Makefile参数传递给自定义目标,以便在CMake构建过程中使用。
Windows下使用Cmake调用Makefile
在Windows上使用CMake调用Makefile是可行的,但需要考虑一些额外因素。首先,Windows上没有默认的Make工具,因此您需要安装GNU Make或其他Make实现。GNU Make通常可以通过安装MinGW或Cygwin获得。
然后,确保将Make工具添加到系统的PATH环境变量中,以便CMake可以找到并调用它。当您在Windows上使用CMake时,生成的构建系统可能是Visual Studio解决方案或NMake文件。因此,调用Makefile时,您需要确保使用了正确的构建系统。
例如,假设您已经安装了GNU Make并将其添加到了系统PATH中。在CMakeLists.txt中,您可以创建一个自定义目标,以便在Windows上调用Makefile:
cmake_minimum_required(VERSION 3.10)
project(MyProject)# ...if(WIN32)add_custom_target(build_with_makefileCOMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endif()
在Windows上使用CMake生成构建文件时,您可能需要指定一个生成器。例如,您可以使用命令行选项-G
指定生成器:
cmake -G "MinGW Makefiles" ..
这将生成适用于MinGW Make的Makefile。然后,您可以使用cmake --build . --target build_with_makefile
命令来调用CMakeLists.txt中定义的自定义目标,进而调用您的原始Makefile。
注意,Visual Studio解决方案使用MSBuild作为其构建系统,而不是Make。当您在Windows上使用CMake生成Visual Studio解决方案时,CMake会生成一个.sln文件和多个.vcxproj文件,这些文件与MSBuild一起工作。在这种情况下,直接在CMakeLists.txt中调用原始的Makefile是不合适的。
不过,如果您仍然需要在Visual Studio解决方案中调用Makefile,可以创建一个自定义的构建事件。您可以在Visual Studio项目属性中设置这个事件,以在构建过程的某个特定阶段调用Makefile。具体操作如下:
- 在Visual Studio中打开您的项目。
- 右键点击项目名称,选择“属性”。
- 在“配置属性”下展开“生成事件”。
- 在“预生成事件命令行”、“预链接事件命令行”或“后生成事件命令行”中输入执行Makefile所需的命令。例如,您可以输入
make -C "$(ProjectDir)"
,其中$(ProjectDir)
是Visual Studio的一个宏,代表项目目录的路径。 - 点击“应用”,然后点击“确定”。
现在,在Visual Studio构建解决方案时,将在指定的构建阶段执行Makefile。需要注意的是,这种方法与CMake在很大程度上是分离的,因此您可能需要手动管理库依赖关系和其他构建设置。
相关文章:
使用CMake调用Makefile 项目
目录标题 基本示例Cmake传递lib给MakefileCmake传递参数给Makefile,比如make cleanWindows下使用Cmake调用Makefile 基本示例 如果项目是使用传统的Makefile构建的,并且您希望使用CMake调用这些Makefile,您可以使用CMake的add_custom_target…...
快速傅里叶变换FFT学习笔记
点值表示法 我们正常表示一个多项式的方式,形如 A ( x ) a 0 a 1 x a 2 x 2 . . . a n x n A(x)a_0a_1xa_2x^2...a_nx^n A(x)a0a1xa2x2...anxn,这是正常人容易看懂的,但是,我们还有一种表示法。 我们知道…...
如何下载安装驱动
1 打开浏览器 这里以Edge浏览器举例 第一步打开桌面上的Edge浏览器 如果您的桌面上没有 那么找到搜索栏 搜索Edge 然后打开 打开之后一般是这样 然后把我发送您的地址 驱动下载地址 https://t.lenovo.com.cn/yfeyfYyD (这个网址只是一个例子) 删除掉前…...
鸿蒙Hi3861学习四-Huawei LiteOS介绍
一、什么是LitesOS Huawei LiteOS是华为针对物联网领域推出的轻量级物联网操作系统,是华为物联网战略的重要组成部分,具备轻量级、低功耗、互联互通、组件丰富、快速开发等关键能力。基于物联网领域业务特征打造领域性技术栈,为开发者提供“一…...
Vue核心 收集表单数据 过滤器
1.14. 收集表单数据 收集表单数据: 若: ,则v-model收集的是value值,用户输入的就是value值。若: ,则v-model收集的是value值,且要给标签配置value值。若: 没有配置input的value属性,那么收集的就是checked(勾选 or 未…...
华为EC6108V9E/EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包
华为EC6108V9E/EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包-内有教程 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的…...
数字化转型导师坚鹏:面向数字化转型的大数据顶层设计实践
面向数字化转型的大数据顶层设计实践 课程背景: 数字化背景下,很多企业存在以下问题: 不清楚大数据思维如何建立? 不清楚企业大数据分析方法? 不了解大数据应用成功案例? 课程特色: …...
day27_mysql
今日内容 零、 复习昨日 一、单表查询 二、多表联查 零、 复习昨日 1 DDL,DML,DQL是啥 DDL 数据定义语言(库,表,列)DML 数据操作语言(表内数据的操作增删改)DQL 数据查询语言(表内数据的查询&am…...
QwtPlotCurve使用说明
QwtPlotCurve是Qwt库中用于绘制曲线的类,可以在QwtPlot上绘制各种类型的曲线,如折线、样条线、散点等。以下是QwtPlotCurve的一些常用函数和使用说明: setSamples(const QPolygonF &samples):设置曲线的数据点,参数…...
JS逆向 -- 某平台登录加密分析
一、打开网站,使用账号密码登录 账号:aiyou123.com 密码:123456 二、通过F12抓包,抓到如下数据,发现密码加密了 三、加密结果是32位,首先考虑是md5加密。 四、全局搜索pwd,点击右上角…...
一分钟快速实现Flask框架的蓝图和视图
一分钟快速实现Flask框架的蓝图和视图 Flask是一个轻量级的Web应用框架,非常适合快速开发小型的Web应用。Flask框架使用蓝图(Blueprint)和视图(View)的概念来组织应用程序的代码。在本文中,我们将介绍如何…...
Mysql 约束练习【第13章_约束】
#第13章_约束 /* 基础知识 1.1 为什么需要约束? 为了保证数据的完整性! 1.2 什么叫约束?对表中字段的限制。 1.3 约束的分类: 角度1:约束的字段的个数 单列约束 vs 多列约束 角度2:约束的作用范围 列…...
java调用cmd命令
1.首先,我们需要了解一下 java是如何调用 cmd的: 6.在实际的开发中,我们有可能会遇到 java调用 cmd命令的情况: 7.对于一些特定的环境下,例如在嵌入式系统中,那么我们可以使用下面这种方式来调用 cmd命令&a…...
Qt音视频开发36-超时检测和自动重连的设计
一、前言 如果网络环境正常设备正常,视频监控系统一般都是按照正常运行下去,不会出现什么问题,但是实际情况会很不同,奇奇怪怪七七八八的问题都会出现,就比如网络出了问题都有很多情况(交换机故障、网线故障、带宽故障等),所以监控系统在运行过程中,还得做超时检测,…...
Reactor 第九篇 WebFlux重构个人中心,效果显著
1 重构背景 原有的开发人员早已离职,代码细节没人知道,经过了一段时间的维护,发现有以下问题: 个人中心系统的特征就是组装各个业务的接口,输出个人中心业务需要的数据,整个系统调用了几十个第三方业务线的…...
Vben Admin 自学记录 —— Drawer组件的基本使用及练习(持续更新中...)
Drawer 抽屉组件 对 antv 的 drawer 组件进行封装,扩展拖拽,全屏,自适应高度等功能。 Drawer相关使用及概念 练习 —— 在之前table基础上,添加查看功能,点击查看按钮,弹出抽屉显示单条表格数据…...
Android 9.0 根据包名默认授予app悬浮窗权限
1.概述 在9.0的设备开发中,对于在app中授予悬浮窗权限,也是通常用的功能,但在设备产品中预制app,需求要求默认授予悬浮窗权限, 就不需要在app中动态申请悬浮窗权限了,所以就来分析下这个实现这个功能 2.根据包名默认授予app悬浮窗权限的核心类 packages\apps\Settings\s…...
Swift中Data,String,[UInt8]的相互转换(6种互相转换)
var dataData() var array[UInt8]() var str"" //Data[UInt8] data.append(10) array[UInt8](data) print(array)//[10] //[UInt8]转Data array[1,2,3,4,5] dataData(array) print(data.count)//5 //Data转String data.removeAll() data.append(contentsOf:[0x31,…...
【微软Bing王炸更新】无需等待,人人可用,答案图文并茂,太牛了
🚀 AI破局先行者 🚀 🌲 AI工具、AI绘图、AI专栏 🍀 🌲 如果你想学到最前沿、最火爆的技术,赶快加入吧✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆&am…...
腾讯云的cdn怎么配置|腾讯云CDN配置教程
众所周知,WordPress系统不挂加速或者是服务器不好速度贼慢,所以要想办法解决访问速度的问题,经过我不断的研究腾讯云的CDN,因为我用的是zibll子比主题,不懂的就挂会导致无法使用第三方登录,因为有缓存导致一直不回调一直卡在那个登录界面和支付没反应要么出现二维码,要么…...
数据结构入门-顺序表链表
线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种实际中广泛使用多个数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线。…...
【AWS入门】AWS Lamda
目录 创建一个Lamda函数用Lamda函数控制启停EC2实例创建一台EC2实例创建角色创建lamda函数 使用Amazon EventBridge计划启停实例创建EventBridge 用户往S3存储桶上传图片文件,触发Lambda函数,将图片压缩并上传至另一个存储桶创建两个存储桶通过Cloudform…...
牛客刷SQL题Day5
SQL69 返回产品并且按照价格排序 select prod_name , prod_price from Products where prod_price between 3 and 6 select prod_name , prod_price from Products where 6>prod_price and prod_price >3 踩坑1: between......and.......包括边界。 踩坑2&am…...
【Errors】【计算机图形学】A-SDF复现的一点纠正记录
ICCV 2021的工作A-SDF,在跑的过程中可能是一些版我Run了这篇工作代码的Reconstruction,然后出现了一点小小的错误,记录如下。 问题一:对数据做直接修改导致出错(可能是不同的pytorch版本导致的?) 错误描述…...
Dockerfile创建镜像文件
Dockerfile Docker镜像原理 Linux文件系统有bootfs和rootfs两部分组成 Docker镜像由特殊文件系统叠加 最底端bootfs,使用宿主机bootfs 第二次时rootfs,被称为基础镜像 向上可以叠加其他镜像文件 同一文件系统能将多层整合成一层,隐藏了多层存在 镜像可以放置…...
javascript中的严格模式
认识严格模式: 在ECMAScript5标准中,JavaScript提出了严格模式的概念(Strict Mode): 严格模式很好理解,是一种具有限制性的JavaScript模式,从而是代码隐式的脱离了“懒散(sloppy)模…...
(二)【平衡小车制作】电机驱动(超详解)
一、硬件设计 1.直流减速电机 直流减速电机,即齿轮减速电机,是在普通直流电机的基础上,加上配套齿轮减速箱。齿轮减速箱的作用是,提供较低的转速,较大的力矩。 简单的来说,STM32分配两个IO口给一个…...
快速了解车联网V2X通信
自动驾驶拥有极其巨大的潜力,有可能改变我们的出行方式。它不仅有望永远改变车辆的设计和制造,还会永远改变汽车的所有权乃至整个交通运输业务。要实现全自动驾驶的目标,开发人员需要开发极为复杂的软件,软件中融入的人工智能(AI)…...
「Codeforces」D. Infinite Set
D. Infinite Set https://codeforces.com/contest/1635/problem/D 题目描述 你有一个由不同正整数组成的数组和一个无限集 S,现在你需要往集合 S 中塞入所有符合 x x x 条件的数。 x x x 的条件(满足其中任意一个即可): x a i …...
项目---基于TCP的高并发聊天系统
目录 服务端 服务端视角下的流程图 一、数据库管理模块 1.1 数据库表的创建 1.2 .对于数据库的操作 1.2.1首先得连接数据库 1.2.2执行数据库语句 1.2.3 返回数据库中存放的所有用户的信息 1.2.4返回数据库中存放的所有用户的好友信息 二、用户管理模块 2.1、UserInfo类&…...
活动手机网站开发/营销型网站特点
今天我们学习几个常用的Dockerfile指令,在 http://docs.docker.com/reference/builder/可以查看Dockerfile中能使用的全部指令的清单。 一、CMD指令 CMD指令用于指定一个容器启动时要运行的命令,这与RUN指令有点类似,但RUN指令是指定镜像被…...
做网站图片素材在线编辑/网络推广网站排名
操作系统实 验 报 告课程名称操作系统实验实验项目名称磁盘调度算法学号班级姓名专业计算机科学与技术学生所在学院计算机科学与技术学院指导教师初妍实验室名称地点21#428哈尔滨工程大学计算机科学与技术学院第六讲 磁盘调度算法一、实验概述1. 实验名称磁盘调度算法2. 实验目…...
php网站建设案例教程/河南网站优化公司哪家好
自动关联包含两种机制: 一种是loadrunner通过对比录制和回放时服务器响应的不同,而提示用户是否进行关联,用户可自己创建关联规则,这个功能可以方便的使我们获得需要关联的部分,但同时也存在一定的问题,如…...
海尔网站建设目标/长沙seo网站排名
Mosquitto库依赖libuuid和openssl库,所以我们在交叉编译Mosquitto之前需要先交叉编译他所需要的依赖库,这里作者已经把需要的源码都下载好了,大家可以在这个文档的目录下找到。不建议大家下载和我不一致的版本,可能会出问题。 mq…...
一些可以做翻译的网站/seo外包网络公司
源码获取:博客首页 "资源" 里下载! 项目介绍 CRM人事管理系统,主要功能有: 用户管理:用户查询、添加用户、编辑、删除; 职位管理:职位查询、添加职位、删除; 部门管理&am…...
织梦制作手机网站/seo关键词软件
调试时总是会遇到各种各样的接口,各种各样的转换板,似懂非懂的感觉很不爽!首先,串口、UART口、COM口、USB口是指的物理接口形式(硬件)。而TTL、RS-232、RS-485是指的电平标准(电信号)。串口:串口是一个泛称,UART&#…...