当前位置: 首页 > news >正文

CMake(2)-详解-编译-安装-支持GDB-添加环境检查-添加版本号-生成安装包

目录

1.什么是CMake    

1.1 编译流程CMakeLists.txt

a) 最简单 demo1

b) 常用demo2

c) 单目录,源文件-输出文件 DIR_SRCS中

d)多目录,多源文件

1.2.执行命令:

1.3.自定义编译选项

2.安装和测试

3.支持GDB

4.添加环境检查

5.添加版本号

6.生成安装包

7.其它工具

7.1qmake

7.2Visual Studio


1.什么是CMake

 

      它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件。

1.1编译流程CMakeLists.txt

a) 最简单 demo1



CMakeLists.txt 文件,并保存在与 http://main.cc 源文件同个目录下
demo1

# cmake 最低版本号要求
cmake_minimum_required(VERSION 2.8)#项目信息
project(Demo1)#指定生成目标
add_executable(Demo main.cpp)# 多文件 
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(<dir> <variable>)
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable(Demo ${DIR_SRCS})

b) 常用demo2

#1.编译器                   cmake_minimum_reqired(VERSION 2.8)
#2.项目名称                 project(test)
#3.头文件的搜索路径         include_directories
#4.用变量代替值             set(variable value)#5.源文件                   add_executable(hello, main.cpp)
#6.源文件生成的链接库文件   add_library(libname STATIC/SHARED sources)
#7.链接库文件               target_link_libraries( target library1 library2 ...)
#8.工程中添加:子目录       add_subdirectory(source_dir)
#9.工程中查找源文件         aux_source_directory(dir varname)# 打印输出                  message(mode "message text")#10.搜索第三方库            find_package(packageName version EXACT/QUIET/REQUIRED)
# EXACT:要求该版本号必须精确匹配  QUIET:禁止显示没有找到时的  REQUIRED:包没有找到,cmake过程终止
#11.列表操作 LIST(APPEND CMAKE_MODULE_PATH ${ PROJECT_SOURCE_DIR}/cmake_modules)
(读、搜索、修改、排序)#12.追加例子 #13.判断语句 if,elseif,endif
#14.循环指令 foreach,endforeach

c) 单目录,源文件-输出文件 DIR_SRCS中
 

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)# 项目信息
project (Demo2)# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)# 指定生成目标
add_executable(Demo ${DIR_SRCS})

d)多目录,多源文件

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)# 项目信息
project (Demo3)#1.多源:添加链接库  指明可执行文件 main 需要连接一个名为 MathFunctions 的链接库
target_link_libraries(Demo MathFunctions)
#1.多源:当前目录
aux_source_directory(. DIR_SRCS)
#1.多源:子目录 
add_subdirectory(math)#2.生成目标: 单个文件
add_executable(Demo main.cc)
#2.生成目标: 生成链接库
aux_source_directory(. DIR_LIB_SRCS)
add_library (MathFunctions ${DIR_LIB_SRCS})

1.2.执行命令:


cmake PATH ,ccmake PATH 生成Makefile。

在当前目录执行 cmake . ,得到 Makefile 后再使用 make 命令编译得到 Demo1 可执行文件。

cmake
make
./Demo

1.3.自定义编译选项


 

1.修改cmakelist.txt 添加该选项
2.修改.cc文件
3.编写 config.h.in
4.编译项目 
5.运用配置,不用配置



1.修改cmakelist.txt 添加该选项
 

cmake_minimum_required (VERSION 2.8)
project (Demo4)# 加入一个配置头文件,用于处理 CMake 对源码的设置
configure_file ("${PROJECT_SOURCE_DIR}/config.h.in""${PROJECT_BINARY_DIR}/config.h")# 是否使用自己的 MathFunctions 库
option (USE_MYMATH"Use provided math implementation" ON)# 是否加入 MathFunctions 库
if (USE_MYMATH)include_directories ("${PROJECT_SOURCE_DIR}/math")add_subdirectory (math)  set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)aux_source_directory(. DIR_SRCS)
add_executable(Demo ${DIR_SRCS})
target_link_libraries (Demo  ${EXTRA_LIBS})


2.修改.cc文件

 

#include <stdio.h>
#include <stdlib.h>
#include "config.h"#ifdef USE_MYMATH#include "math/MathFunctions.h"
#else#include <math.h>
#endifint main(int argc, char *argv[])
{if (argc < 3){printf("Usage: %s base exponent \n", argv[0]);return 1;}double base = atof(argv[1]);int exponent = atoi(argv[2]);#ifdef USE_MYMATHprintf("Now we use our own Math library. \n");double result = power(base, exponent);
#elseprintf("Now we use the standard library. \n");double result = pow(base, exponent);
#endifprintf("%g ^ %d is %g\n", base, exponent, result);return 0;
}


3.编写 config.h.in
 

#cmakedefine USE_MYMATH


4.编译项目 

 

现在编译一下这个项目,为了便于交互式的选择该变量的值,可以使用 ccmake 命令(也可以使用 cmake -i 命令,该命令会提供一个会话式的交互式配置界面):



5.运用配置,不用配置

2.安装和测试


   CMake 也可以指定安装规则,以及添加测试。这两个功能分别可以通过在产生 Makefile 后使用 make install 和 make test 来执行。

  首先先在 math/CMakeLists.txt 文件里添加下面两行:

# 指定 MathFunctions 库的安装路径
install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)# 指定安装路径
install (TARGETS Demo DESTINATION bin)
install (FILES "${PROJECT_BINARY_DIR}/config.h"DESTINATION include)


通过上面的定制,生成的 Demo 文件和 MathFunctions 函数库 libMathFunctions.o 文件将会被复制到 /usr/local/bin 中,而 MathFunctions.h 和生成的 config.h 文件则会被复制到 /usr/local/include 中。

我们可以验证一下(顺带一提的是,这里的 /usr/local/ 是默认安装到的根目录,可以通过修改 CMAKE_INSTALL_PREFIX 变量的值来指定这些文件应该拷贝到哪个根目录):

测试:
 

# 启用测试
enable_testing()# 测试程序是否成功运行
add_test (test_run Demo 5 2)# 测试帮助信息是否可以正常提示
add_test (test_usage Demo)
set_tests_properties (test_usagePROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")# 测试 5 的平方
add_test (test_5_2 Demo 5 2)set_tests_properties (test_5_2PROPERTIES PASS_REGULAR_EXPRESSION "is 25")# 测试 10 的 5 次方
add_test (test_10_5 Demo 10 5)set_tests_properties (test_10_5PROPERTIES PASS_REGULAR_EXPRESSION "is 100000")# 测试 2 的 10 次方
add_test (test_2_10 Demo 2 10)set_tests_properties (test_2_10PROPERTIES PASS_REGULAR_EXPRESSION "is 1024")

cmd :make test

# 定义一个宏,用来简化测试工作
macro (do_test arg1 arg2 result)add_test (test_${arg1}_${arg2} Demo ${arg1} ${arg2})set_tests_properties (test_${arg1}_${arg2}PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)# 使用该宏进行一系列的数据测试
do_test (5 2 "is 25")
do_test (10 5 "is 100000")
do_test (2 10 "is 1024")


3.支持GDB

set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")


 

4.添加环境检查

4.1 修改顶层的CMakeLists.txt 文件
添加 CheckFunctionExists.cmake 宏,
并调用 check_function_exists 命令测试链接器是否能够在链接阶段找到 pow 函数。

 

# 检查系统是否支持 pow 函数
include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists (pow HAVE_POW)

4.2预定义相关宏变量
 

#cmakedefine HAVE_POW

4.3在代码中使用宏和函数

 

#ifdef HAVE_POWprintf("Now we use the standard library. \n");double result = pow(base, exponent);
#elseprintf("Now we use our own Math library. \n");double result = power(base, exponent);
#endif




5.添加版本号

首先修改顶层 CMakeLists 文件,在 project 命令之后加入如下两行:

set (Demo_VERSION_MAJOR 1)
set (Demo_VERSION_MINOR 0)

修改 http://config.h.in 文件,添加两个预定义变量:
 

// the configured options and settings for Tutorial
#define Demo_VERSION_MAJOR @Demo_VERSION_MAJOR@
#define Demo_VERSION_MINOR @Demo_VERSION_MINOR@

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "config.h"
#include "math/MathFunctions.h"int main(int argc, char *argv[])
{if (argc < 3){// print version infoprintf("%s Version %d.%d\n",argv[0],Demo_VERSION_MAJOR,Demo_VERSION_MINOR);printf("Usage: %s base exponent \n", argv[0]);return 1;}double base = atof(argv[1]);int exponent = atoi(argv[2]);#if defined (HAVE_POW)printf("Now we use the standard library. \n");double result = pow(base, exponent);
#elseprintf("Now we use our own Math library. \n");double result = power(base, exponent);
#endifprintf("%g ^ %d is %g\n", base, exponent, result);return 0;
}

6.生成安装包

 

顶层的 CMakeLists.txt 文件尾部添加下面几行:

# 构建一个 CPack 安装包
include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE"${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${Demo_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}")
include (CPack)

  1. 导入 InstallRequiredSystemLibraries 模块,以便之后导入 CPack 模块;
  2. 设置一些 CPack 相关变量,包括版权信息和版本信息,其中版本信息用了上一节定义的版本号;
  3. 导入 CPack 模块。

接下来的工作是像往常一样构建工程,并执行 cpack 命令。

  • 生成二进制安装包:
cpack -C CPackConfig.cmake

生成源码安装包
 

cpack -C CPackSourceConfig.cmake

此时会在该目录下创建 3 个不同格式的二进制包文件:

[ehome@xman Demo8]$ ls Demo8-*
Demo8-1.0.1-Linux.sh  Demo8-1.0.1-Linux.tar.gz  Demo8-1.0.1-Linux.tar.Z

完成后提示安装到了 Demo8-1.0.1-Linux 子目录中,我们可以进去执行该程序:

[ehome@xman Demo8]$ ./Demo8-1.0.1-Linux/bin/Demo 5 2
Now we use our own Math library. 
5 ^ 2 is 25

7.其它工具


7.1qmake
 

converter 可以转换使用 QT 的 qmake 的工程.
 

7.2Visual Studio

  • vcproj2cmake.rb 可以根据 Visual Studio 的工程文件(后缀名是 .vcproj 或 .vcxproj)生成 CMakeLists.txt 文件。
  • vcproj2cmake.ps1 vcproj2cmake 的 PowerShell 版本。
  • folders4cmake 根据 Visual Studio 项目文件生成相应的 “source_group” 信息,这些信息可以很方便的在 CMake 脚本中使用。支持 Visual Studio 9/10 工程文件。



 

相关文章:

CMake(2)-详解-编译-安装-支持GDB-添加环境检查-添加版本号-生成安装包

目录 1.什么是CMake 1.1 编译流程CMakeLists.txt a) 最简单 demo1 b) 常用demo2 c) 单目录&#xff0c;源文件-输出文件 DIR_SRCS中 d)多目录&#xff0c;多源文件 1.2.执行命令&#xff1a; 1.3.自定义编译选项 2.安装和测试 3.支持GDB 4.添加环境检查 5.添加…...

java面试题(redis)

目录 1.redis主要消耗什么物理资源&#xff1f; 2.单线程为什么快 3.为什么要使用Redis 4.简述redis事务实现 5.redis缓存读写策略 6.redis除了做缓存&#xff0c;还能做些什么&#xff1f; 7.redis主从复制的原理 8.Redis有哪些数据结构&#xff1f;分别有哪些典型的应…...

Vue组件懒加载

组件懒加载 前言 组件懒加载最常用于异步加载大型/复杂组件或在需要时才进行加载 Vue 2和Vue 3均支持组件懒加载&#xff0c;本文将介绍如何在Vue 2和Vue 3中实现组件懒加载&#xff0c;和一些使用场景 1️⃣方法一&#xff1a;使用Webpack的代码分割能力 Vue 2和Vue 3都可以…...

Qt音视频开发42-网络推流(视频推流/本地摄像头推流/桌面推流/网络摄像头转发推流等)

一、前言 上次实现的文件推流&#xff0c;尽管优点很多&#xff0c;但是只能对现在存在的生成好的音视频文件推流&#xff0c;而现在更多的场景是需要将实时的视频流重新推流分发&#xff0c;用户在很多设备比如手机/平板/网页/电脑/服务器上观看&#xff0c;这样就可以很方便…...

更简单的存取Bean方式-@Bean方法注解

1.Bean方法存储 类注解是添加在某个类上的,那么方法注解是添加在某个方法前的 public class UserBeans {Beanpublic User user1(){User user new User();user.setUid(001);user.setUname("zhangsan");user.setAge(19);user.setPassword("123123");retur…...

边缘计算与AI布署应用电力物联网解决方案-RK3588开发平台

电力行业拥有规模庞大的各类设备&#xff0c;如电表、各类保护、采集、控制设备。面对分布式发电、储能、用户微网等一系列综合问题&#xff0c;边缘计算与AI布署可满足“端侧本地化”高效运用的需求&#xff0c;协助提升最后一公里运行效率。 瑞芯微RK3588J、内置独立NPU&…...

centos部署unity accelerator

参考 https://docs.unity3d.com/Manual/UnityAccelerator.html 方案1&#xff1a;下载Unity Accelerator 手动安装&#xff0c; unity-accelerator-app-v1.0.941g6b39b61.AppImage为下载的文件 1、放入服务器目录, chmod x unity-accelerator-app-v1.0.941g6b39b61.AppImage 2…...

HANA开发指南

建模方面 1、建模方式&#xff1a;图像化建模、SQL建模、CE语言建模 2、维护&#xff1a;SQL和CE比图形化建模更容易维护和修改 3、性能&#xff1a;图形化和CE会经过系统优化&#xff0c;性能一般优于SQL语言 4、可按需要设置参数、变量、Hierachy、聚合类型等 5、在S4系…...

请问你见过吐代码的泡泡吗(冒泡排序)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《算法详解》&#xff0c;笔者用重金(时间和精力)打造&#xff0c;将算法知识一网打尽&#xff0c;希望可以…...

【VM服务管家】VM4.0平台SDK_2.1环境配置类

目录 2.1.1 环境配置&#xff1a;CSharp二次开发环境配置方法2.1.2 环境配置&#xff1a;Qt二次开发环境配置方法2.1.3 环境配置&#xff1a;MFC二次开发环境配置方法2.1.4 环境配置&#xff1a;VB.Net二次开发环境配置方法2.1.5 环境配置&#xff1a;运行出现Vm.Core.Solution…...

最新研究:可审计的具有拜占庭鲁棒的联邦学习方案

Y. Liang, Y. Li and B. -S. Shin, “Auditable Federated Learning With Byzantine Robustness,” in IEEE Transactions on Computational Social Systems, doi: 10.1109/TCSS.2023.3266019. 可免费下载&#xff1a;https://download.csdn.net/download/liangyihuai/87727720…...

JDK1.8下载、安装和环境配置教程

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f9be;&#x1f9be;​​​​​​​ 目录 window系统安装java 下载JDK 配置环境变量 …...

天津超算,青索帮助文档

连接 第一步&#xff0c;点击 配置VPN&#xff08;切换到局域网用&#xff09;和机器&#xff08;也就是各套超算系统&#xff09;。 第二步&#xff0c;点击 机器 选择对应的机器。通常会在下方显示可用的机器&#xff0c;单击其中一个即可。如果只有一个机器&#xff0c;…...

SpringMVC的拦截器和异常处理器

目录 lerInterceptor 拦截器 1、拦截器的作用 2、拦截器的创建 3、拦截器的三个抽象方法 4、拦截器的配置 5、多个拦截器的执行顺序 SpringMVC的异常处理器 1、异常处理器概述 2、基于配置文件的异常处理 3、基于注解的异常处理 lerInterceptor 拦截器 1、拦截器的作…...

查看库文件是32位还是64位|查看lib是静态库还是导入库|判断是debug模式还是release模式

文章目录 dll位数查看lib位数查看查看lib库是静态库还是导入库dll库文件信息查看lib库文件内容查看dll库查看编译模式是debug还是release方法一方法二方法三 lib静态库查看编译模式是debug还是release方法一方法二 lib导入库查看编译模式是debug还是release查看Linux下的.a库&a…...

Python小姿势 - Python爬取数据的库——Scrapy

Python爬取数据的库——Scrapy 一、爬虫的基本原理 爬虫的基本原理就是模拟人的行为&#xff0c;使用指定的工具和方法访问网站&#xff0c;然后把网站上的内容抓取到本地来。 爬虫的基本步骤&#xff1a; 1、获取URL地址&#xff1a; 2、发送请求获取网页源码&#xff1b; 3、…...

[C++初阶]栈和队列_优先级队列的模拟实现 deque类 的理解

为了更好的理解优先级队列priority_queue&#xff0c;这里会同时进行栈和队列的提及 文章目录 简要概念&#xff08;栈和队列&#xff09;栈和队列的模拟实现与使用stack&#xff08;栈&#xff09;deque的理解和操作queue priority_queue&#xff08;优先级队列&#xff09;框…...

Spring是什么?关于Spring家族

初识Spring 什么是Spring&#xff1f; Spring是一个开源的Java企业级应用程序开发框架&#xff0c;由Rod Johnson于2003年创建&#xff0c;并在接下来的几年里得到了广泛的发展和应用。它提供了一系列面向对象的编程和配置模型&#xff0c;支持开发各种类型的应用程序&#x…...

自然语言处理数据集集锦(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 最近更新时间&#xff1a;2023.4.26 最早更新时间&#xff1a;2023.4.25 文本摘要主题的数据集见我之前写的另一篇博文&#xff1a;文本摘要数据集的整理、总结及介绍&#xff08;持续更新ing…&#xff09; 智能司法主题的数据集我准备等项目…...

93、Dehazing-NeRF: Neural Radiance Fields from Hazy Images

简介 论文&#xff1a;https://arxiv.org/pdf/2304.11448.pdf 从模糊图像输入中恢复清晰NeRF 使用大气散射模型模拟有雾图像的物理成像过程&#xff0c;联合学习大气散射模型和干净的NeRF模型&#xff0c;用于图像去雾和新视图合成 通过将NeRF 3D场景的深度估计与大气散射模…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

基于谷歌ADK的 智能产品推荐系统(2): 模块功能详解

在我的上一篇博客&#xff1a;基于谷歌ADK的 智能产品推荐系统(1): 功能简介-CSDN博客 中我们介绍了个性化购物 Agent 项目&#xff0c;该项目展示了一个强大的框架&#xff0c;旨在模拟和实现在线购物环境中的智能导购。它不仅仅是一个简单的聊天机器人&#xff0c;更是一个集…...