如何使用Cmake编译

2023-05-16

目录

一、Cmake是一种跨平台编译工具

二、CMake说明

三、编写CMakeList.txt

四、使用 cmake


一、Cmake是一种跨平台编译工具

比make更高级,使用起来要方便得多。

CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需的makefile文件,最后用make命令编译源码生产可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤:

1.cmake

2.make

二、CMake说明

  一般把CMakeLists.txt文件放在工程目录下,使用时,先创建一个叫build的文件夹(这个并非必须,因为cmake后生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译),然后执行下操作:

cd build

cmake  ..

make

其中cmake  .. 在build里生成Makefile,make根据生成的makefile文件,编译程序,make应当在有Makefile生成可执行文件。

三、编写CMakeList.txt

# 1. 声明要求的cmake最低版本
cmake_minimum_required( VERSION 2.8 )
​
# 2. 添加c++11标准支持
#set( CMAKE_CXX_FLAGS "-std=c++11" )
​
# 3. 声明一个cmake工程
PROJECT(rpt_main)
​
MESSAGE(STATUS "Project: SERVER") #打印相关消息消息
  
# 4. 头文件
include_directories(
${PROJECT_SOURCE_DIR}/../include/mq 
${PROJECT_SOURCE_DIR}/../include/incl 
${PROJECT_SOURCE_DIR}/../include/rapidjson
)
​
# 5. 通过设定SRC变量,将源代码路径都给SRC,如果有多个,可以直接在后面继续添加
set(SRC 
${PROJECT_SOURCE_DIR}/../include/incl/tfc_base_config_file.cpp 
${PROJECT_SOURCE_DIR}/../include/mq/tfc_ipc_sv.cpp 
${PROJECT_SOURCE_DIR}/../include/mq/tfc_net_ipc_mq.cpp
${PROJECT_SOURCE_DIR}/../include/mq/tfc_net_open_mq.cpp 
${PROJECT_SOURCE_DIR}/local_util.cpp
${PROJECT_SOURCE_DIR}/AgentMemRpt.cpp 
${PROJECT_SOURCE_DIR}/AgentDiskRpt.cpp 
${PROJECT_SOURCE_DIR}/AgentLoadRpt.cpp 
${PROJECT_SOURCE_DIR}/AgentIoRpt.cpp
${PROJECT_SOURCE_DIR}/AgentNetRpt.cpp 
${PROJECT_SOURCE_DIR}/AgentCpuRpt.cpp 
${PROJECT_SOURCE_DIR}/AgentProcessRpt.cpp 
${PROJECT_SOURCE_DIR}/AgentParentRpt.cpp
${PROJECT_SOURCE_DIR}/AgentSysTop_5.cpp 
${PROJECT_SOURCE_DIR}/BaseFeatureRptMain.cpp 
)
​
# 6. 创建共享库/静态库
​
# 设置路径(下面生成共享库的路径)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
# 即生成的共享库在工程文件夹下的lib文件夹中
 
set(LIB_NAME rpt_main_lib)
# 创建共享库(把工程内的cpp文件都创建成共享库文件,方便通过头文件来调用)
# 这时候只需要cpp,不需要有主函数 
# ${PROJECT_NAME}是生成的库名 表示生成的共享库文件就叫做 lib工程名.so
# 也可以专门写cmakelists来编译一个没有主函数的程序来生成共享库,供其它程序使用
# SHARED为生成动态库,STATIC为生成静态库
add_library(${LIB_NAME} STATIC ${SRC})
 
# 7. 链接库文件
# 把刚刚生成的${LIB_NAME}库和所需的其它库链接起来
# 如果需要链接其他的动态库,-l后接去除lib前缀和.so后缀的名称,以链接
# libpthread.so 为例,-lpthread
target_link_libraries(${LIB_NAME} pthread dl)
   
# 8. 编译主函数,生成可执行文件
# 先设置路径
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
   
# 可执行文件生成
add_executable(${PROJECT_NAME} ${SRC})
   
# 这个可执行文件所需的库(一般就是刚刚生成的工程的库咯)
target_link_libraries(${PROJECT_NAME} pthread dl ${LIB_NAME})

四、使用 cmake

  • 进入/home/pzqu/agent/libvirt_base_feature/build目录
  • 执行命令 cmake ..

 cmake  ..

  • 查看生成的目录结构,此目录结构是中间代码,不用提交到git
[root@TJSJZVM000456 /home/pzqu/agent/libvirt_base_feature/build]# tree
.
|-- CMakeCache.txt
|-- CMakeFiles
| |-- 2.8.12.2
| | |-- CMakeCCompiler.cmake
| | |-- CMakeCXXCompiler.cmake
| | |-- CMakeDetermineCompilerABI_C.bin
| | |-- CMakeDetermineCompilerABI_CXX.bin
| | |-- CMakeSystem.cmake
| | |-- CompilerIdC
| | | |-- CMakeCCompilerId.c
| | | `-- a.out
| | `-- CompilerIdCXX
| | |-- CMakeCXXCompilerId.cpp
| | `-- a.out
| |-- CMakeDirectoryInformation.cmake
| |-- CMakeOutput.log
| |-- CMakeTmp
| |-- Makefile.cmake
| |-- Makefile2
| |-- TargetDirectories.txt
| |-- cmake.check_cache
| |-- progress.marks
| |-- rpt_main.dir
| | |-- DependInfo.cmake
| | |-- build.make
| | |-- cmake_clean.cmake
| | |-- depend.make
| | |-- flags.make
| | |-- home
| | | `-- pzqu
| | | `-- agent
| | | `-- include
| | | |-- incl
| | | `-- mq
| | |-- link.txt
| | `-- progress.make
| `-- rpt_main_lib.dir
| |-- DependInfo.cmake
| |-- build.make
| |-- cmake_clean.cmake
| |-- cmake_clean_target.cmake
| |-- depend.make
| |-- flags.make
| |-- home
| | `-- pzqu
| | `-- agent
| | `-- include
| | |-- incl
| | `-- mq
| |-- link.txt
| `-- progress.make
|-- Makefile
`-- cmake_install.cmake
  • 使用make命令编译得到二进制文件

make

  • 二进制文件所在目录(CMakeLists.txt文件配置)

成功生成二进制文件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Cmake编译 的相关文章

  • IMU及磁力计AHRS系统控制(一):传感器物理实现原理

    AHRS系统前言 AHRS是 Attitude and heading reference system 的英文缩写 xff0c 百度对此的解释是 航姿参考系统 xff0c 按笔者比较浅薄的理解就是在计算平台上通过算法处理一套部署在被控对象
  • 归并排序(C语言)详解

    记录学习第五天 今天记录一下归并排序 xff0c 因为在csdn里面没有找到特别清楚的解析 xff0c 所以想自己写的认真一点 xff0c 也查阅了一些资料 xff0c 通过这篇博客记录一下 xff1b 归并排序 xff0c 光看字面 xf
  • HTML的块级元素(常用整理)

    emmm xff0c 最近想整理复习一下前端的基础 xff0c 最开始的HTML想了好久也没想好怎么写 xff0c 最后也是决定以行块这样整理 xff0c 再在后面补充吧 说到HTML xff0c 什么是HTML呢 xff1f 什么是 HT
  • JS实现快速排序(代码+讲解)

    OK xff0c 排序这一个篇章也快要结束了 这一篇主要说的是快速排序 xff0c 说的方式主要还是先说原理 xff0c 然后再用代码来进行实现 所谓快速排序 xff0c 就是分为三步走 xff1a 第一步 xff1a 选择第一个数字分离出
  • Object.defineProperty方法(详解)

    OK xff0c 这一篇主要想说一下Object defineProperty这个方法 这个方法也是Vue数据双向绑定原理的常见面试题 所以也是有必要好好掌握的哦 首先我们知道JS中是支持面向对象编程的 xff0c 也是有着对象和类这样的概
  • 原生JS实现Promise(详解)

    摘要 首先呢 xff0c Promise是异步中比较重要的知识点 xff0c 学习的最好方法就是掌握它的基本原理 所以这一篇主要说一下如何用JS来实现一个自己的promise 构造函数 首先我们来看一下我们是如何使用promise的 xff
  • 解决winscp连接ubuntu虚拟机连续超时

    1 禁用虚拟机网络 在windows系统找到网络适配器 xff0c 禁用VMnet1和VMnet8 2 更改网络连接模式并测试网络是否连通 菜单栏 虚拟机 设置 网络适配器 xff0c 将网络模式改为桥接模式 xff0c 勾选 复制物理网络
  • Http的各种请求方法(详解)

    摘要 我们知道 xff0c 当我们访问各种网页的时候 xff0c 之所以能够看到页面 xff0c 根本原因是发送了http请求然后得到了响应 xff0c 从而页面才会弹出来 再或者我们上传一些照片和视频时 xff0c 之所以可以上传成功也是
  • React中ref的使用方法和使用场景(详解)

    摘要 不管在Vue中还是React xff0c 如果我们想使用一个元素的DOM xff0c 不需要通过JS中操纵DOM的方法 xff0c 它们提供了一个专属的API就是ref 而Vue中的ref可能比较简单 xff0c 这一篇主要讲一下如何
  • 原生JS的拖拽属性draggable(详解)

    摘要 作为h5新增的属性draggable xff0c 它能够给与一切的html元素拖动的效果 而在这个属性之下 xff0c 也有着关于拖动效果的各个方法 而这一篇文章 xff0c 主要就是说一下关于draggable属性的使用以及工作场景
  • 一篇搞定JS的位运算(公式+力扣真题)--- 持续更新

    摘要 位操作 xff08 Bit Manipulation xff09 是程序设计中对位模式或二进制数的一元和二元操作 在许多古老的微处理器上 xff0c 位运算比加减运算略快 xff0c 通常位运算比乘除法运算要快很多 在现代编程语言中
  • 【C++实现HTTP服务器项目记录】HTTP报文处理

    文章目录 一 HTTP报文格式1 请求报文2 响应报文 二 解析HTTP请求报文1 有限状态机2 状态转换图3 代码实现 三 生成HTTP响应报文1 代码实现 四 内存映射五 获取文件属性六 高级I O1 聚集写2 解决大文件传输问题 一
  • 使用PX4 模拟无人机起降 jmavsim或Gazebo环境下

    安装PX4的教程较多 xff0c 可在linux xff0c macos windows上进行安装 推荐Linux 笔者使用的是Ubuntu20 04 原因如下图 xff1a 安装好PX4后 cd到PX4安装目录 xff0c 启动仿真器 x
  • C++标准库--IO类库

    文章目录 前言一 IO类二 文件输入输出1 fstream的操作2 文件模式 三 String流 前言 C 43 43 语言本身没有输入输出 xff0c 而是通过定义在标准库中的类型来处理IO xff0c 这些类型支持从文件 xff0c 控
  • 总线协议一(UART/RS232/RS485/IIC/SPI)

    目录 基础概述 xff1a 一 UART xff08 为串口通信方式 xff09 二 RS232协议 三 RS485协议 四 I2C总线协议 五 SPI总线 六 I2C和SPI的区别 基础概述 xff1a 总线的本质就是一根导线 xff0c
  • HTTP协议分析(完整版)

    HTTP协议 一 http协议简介二 http工作原理1 客户端连接到Web服务器2 发送HTTP请求3 服务器接受请求并返回HTTP响应4 释放连接TCP连接5 客户端浏览器解析HTML内容 三 http请求方法四 http状态码1 状态
  • 【linux网络编程】-UDP客户端

    客户端实现 1 注 xff1a 客户端实现中可以不用bind地址 xff0c 当你发送数据到指定服务端时 xff0c 操作系统会为客户端自动分配端口 span class token keyword int span span class
  • 删除字符串中的各种标点符号的方法

    1 用re findall w 43 string 匹配字母 xff0c 数字和下划线 xff0c 返回列表 2 用 join 列表 将列表中元素再拼接成字符串
  • 在ubuntu18.04中切换python版本(个人记录)

    首先通过ls命令查一下目前ubuntu系统中已安装的python版本 ls l usr bin grep python 然后通过以下命令查看目前有哪些可供选择的python版本 update alternatives list python
  • ORB-SLAM2建立自己的数据集

    ORB SLAM2建立自己的数据集 使用ZED2拍摄视频剪裁视频分割图片运行数据集记录 使用ZED2拍摄视频 这里没有使用程序将ZED2双目相机拍摄成两幅画面 xff0c 而是直接使用软件拍摄视频 若有大佬有相关代码还是很希望能发我下 拍的

随机推荐

  • STM32—DMA功能讲解串口发送

    目录 一 DMA基本介绍 1 DMA的定义 2 DMA数据传输 二 DMA功能框图 编辑 1 DMA请求 2 通道 3 仲裁器 三 DMA数据配置 1 传输方向及地址 2 传输数据大小及单位 3 传输完成 三 DMA初始化结构体详解 1 D
  • 最新 Xilinx vivado IP许可申请

    最新 Xilinx vivado IP许可申请 xilinx的fpga使用vivado开发 xff0c zynq系列fpga的SOC开发成为主流 xff0c 加快fpga开发 xff0c 也进一步提高了fpga开发的灵活性 xilinx提供
  • C++调用Yolov3模型实现目标检测

    C 43 43 调用Yolov3模型实现目标检测 使用开源权重文件 xff0c 此训练模型包含80种物体 文件下载地址 xff1a 预训练权重文件 xff1a https pjreddie com media files yolov3 we
  • 无人驾驶-控制-坐标系转化

    无人驾驶 坐标系转化 一 坐标系概念1 1 WGS 84坐标系1 1 1 简介1 1 2 角度范围1 1 3 基本参数1 1 4 坐标系图示 1 2 ECEF地心坐标系1 2 1 简介1 2 2 坐标系图解 1 3 ENU东北天坐标系1 3
  • 几何实体图形保存成stl格式的ascII和二进制文。用Vc++语言读入文件,给三角网格坐标值乘以2,并保存到另一stl文件。输出完成工作所用的执行时间

    1 题目 xff1a CAD CAM软件生成几何实体图形 xff0c 图形形状不限 xff0c 但图形需包含曲面 xff0c 分别保存成stl格式的ascII和二进制文 用Vc 43 43 语言读入文件 xff0c 给所有三角网格坐标值乘以
  • windows下vscode连接Linux中的MySQL(非常实用)

    于初学Linux系统的小伙伴来说 xff0c 由于对Linux系统及其在windows下的环境配置比较生疏 xff0c 所以当使用windows下vscode连接Linux中的MySQL xff0c 并进行相关研发时 xff0c 颇为头疼
  • UDP通信实现(客户端和服务器端)

    服务器端 xff1a include lt stdio h gt include lt stdlib h gt include lt unistd h gt include lt string h gt include lt arpa in
  • conda环境的激活与关闭

    激活conda环境 conda activate 关闭conda环境 conda deactivate 打开终端自动进入conda环境 conda config set auto activate base true 关闭打开终端自动进入c
  • C语言结构体字节对齐规则

    注 xff1a 图片中蓝色圆圈表示空闲的字节空间 xff0c 黄色表示成员占有的字节空间 编译器一般默认4字节对齐 xff0c 当然也有8字节对齐的 xff0c 但是如果结构体没有使用8字节的数据类型 xff0c 其实也可以认为是4字节对齐
  • c语言输出对齐的方法

    关于c语言输出对其方法 左对齐右对齐附乘法表代码 左对齐 当输出多个数据时 xff0c 由于每个数据的字符长度不同 xff0c 所以需要对齐 xff0c 左对齐时方法如下 xff1a span class token function pr
  • 多线程与网络编程

    一 网络协议 应用层 HTTP FTP TFTP SMTP SNMP DNS 传输层 TCP UDP 网络层 ICMP IGMP IP ARP RARP 数据链路层 由底层网络定义的协议 物理层 由底层网络定义的协议 二 TCP与UDP x
  • const和define区别与比较

    xff08 1 xff09 就起作用的阶段而言 xff1a define是在编译的预处理阶段起作用 xff0c 而const是在编译 运行的时候起作用 xff08 2 xff09 就起作用的方式而言 xff1a define只是简单的字符替
  • FreeRTOS中任务栈内存分配

    前言 在RAM中大多数的空间分配为任务栈和系统栈两部分 任务栈 xff1a 顾名思义就是用来跑任务的 xff0c 当我们xTaskCreate一个任务时 xff0c 但是在这块任务栈里面动态分配空间 系统栈 xff1a 任务栈是不使用这里的
  • 网络编程(0816-林雪阵)

    完成seclect TCP客户端 include lt stdio h gt include lt sys types h gt include lt sys socket h gt include lt arpa inet h gt in
  • yolov5获取边框坐标

    这里使用的是5 0版本 打开detect py xff0c 找到 Write results模块 xff0c 找到 save one box ctr 43 鼠标点击 xff0c 进入general py xff0c 会自动定位到 save
  • ROS介绍以及常用指令

    ROS 1 什么是ros ROS 的雏形诞生 xff1a 斯坦福大学人工智能实验室的STAIR 机器人项目这个项目希望完成一个服务机器人原型 xff0c 在视觉的辅助下 xff0c 可以在复杂环境中运动 xff0c 还可以通过机械臂操控环境
  • 基于ROS的YOLOV3实现目标检测项目过程记录

    2020 08 07 问题记录 1 要命的darknet ros 整体逻辑是用yolo检测出目标 然后通过ros节点将目标类别和位置信息发布出来 因此选择ros darknet 2个问题 1 依赖opencv和boost boost库安装过
  • 【Jetson目标检测SSD-MobileNet应用实例】(五)根据输出的检测结果,使用串口和STM32配合进行电机控制

    Jetson目标检测SSD MobileNet应用实例 xff08 一 xff09 win11中配置SSD MobileNet网络训练境搭建 Jetson目标检测SSD MobileNet应用实例 xff08 二 xff09 制作自己的数据
  • QT5.14串口调试助手:上位机接收数据解析数据帧+多通道波形显示+数据保存为csv文件

    由于业务需要 xff0c 在上个月做了一个关于qt的设计 xff0c 在设计中主要需要解决的问题就是接收单片机采集到的数据并在上位机将数字实时的通过波形显示出来 xff0c 然后上位机要有保存下数据文件的功能 xff0c 便于后续的软件读取
  • 如何使用Cmake编译

    目录 一 Cmake是一种跨平台编译工具 二 CMake说明 三 编写CMakeList txt 四 使用 cmake 一 Cmake是一种跨平台编译工具 比make更高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLi