[CMake教程](四)CMake 配置生成lib或者so的库文件

2023-05-16

[CMake教程](四)CMake 配置生成lib或者so的库文件

在这里插入图片描述

(1)系列教程介绍

  上面几个教程我们的程序都是生成可执行文件。但是我们在合作开发算法的时候经常需要交付的是一个模块,该模块提供特定的算法功能,用于给整体的项目进行调用。但我们又不能直接提供源码,所以我们可以提供一个库文件(静态库或者动态库),配置接口文件可以在不提供源代码的情况下给他人提供算法模块功能。本文主要讲述如何使用CMakeLists.txt,配置生成动态和静态库文件。

(2)CMake 的使用环境和安装

本教程的使用环境为:

ubutu18.04 lts
gcc version 7.5.0
g++ version 7.5.0
cmake version 3.10.2

安装cmake:

sudo apt install cmake 

(3)设置设置我们的程序输出为lib文件

  配置输出库文件(lib和so)主要是通过函数add_subdirectory进行配置,使用STATIC表示静态库(lib),SHARED表示动态库(so)。同时可以使用SET_TARGET_PROPERTIES函数可以设置库文件的版本。

首先,看一下整体的目录结构:


|-- tutorial_fourth/  

  |-- src/
      
      |-- tutorial.cpp

  |-- include/
      
      |--TutorialConfig.h.in

  |-- mathlib/
      
      |-- CMakeLists.txt 

      |-- mathlib.h

      |-- mathlib.cpp

  |-- CMakeLists.txt  

根目录下的CMakeLists.txt文件为:

# 设置cmake的最低版本
cmake_minimum_required(VERSION 3.10)

# 设置工程名称 和版本
project(tutorial VERSION 1.0)

# 设置指定的C++编译器版本是必须的,如果不设置,或者为OFF,则指定版本不可用时,会使用上一版本。
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 指定为C++11 版本
set(CMAKE_CXX_STANDARD 11)

# 提供一个选项是OFF或者ON,如果没有初始值被提供则默认使用OFF
option(USE_MYMATH "Use tutorial provided math implementation" ON)

# 指定版本号的配置文件  
configure_file(include/TutorialConfig.h.in TutorialConfig.h)

# 判断变量USE_MYMATH是否设置了ON,如果设置了配置mathlib library
if(USE_MYMATH)
  # 添加一个名字为mathlib的子编译路径
  add_subdirectory(mathlib)
  
  # 列出mathlib库的所有项目,并添加到外部库变量EXTRA_LIBS中
  list(APPEND EXTRA_LIBS mathlib)

  # 将子路径"${PROJECT_SOURCE_DIR}/mathlib"添加到外部路径变量EXTRA_INCLUDES中
  list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/mathlib")
endif()

# 增加生成可执行文件,生成的程序名称为:tutorial_first
add_executable(tutorial src/tutorial.cpp)

# 对目标的外部库进行链接操作
target_link_libraries(tutorial PUBLIC ${EXTRA_LIBS})

# 为指定项目添加 include 路径
target_include_directories(tutorial PUBLIC
                        "${PROJECT_BINARY_DIR}"
                        ${EXTRA_INCLUDES}
)

mathlib路径下CMakeLists.txt文件为:

# 设置动态库的版本 为1.2
SET_TARGET_PROPERTIES(mathlib PROPERTIES VERSION 1.2 SOVERSION 1)

# 为库mathlib 添加源文件,该命令声明库文件 
add_library(mathlib mathlib.cpp)

为了将cmake中的变量自动传递到程序中,在TutorialConfig.h.in中添加#cmakedefine USE_MYMATH命令用于在cmake中生成USE_MYMATH宏定义。
TutorialConfig.h.in中代码为:

// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @tutorial_second_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @tutorial_second_VERSION_MINOR@
#cmakedefine USE_MYMATH

在程序tutorial.cpp中添加处理命令:在cmake中定义USE_MYMATH的时候在程序中才会编译该命令块。具体请看CMakeDemo4代码。

#ifdef USE_MYMATH
#  include "MathFunctions.h"
#endif

命令使用:

set_target_properties:设置目标的属性值

set_target_properties(target1 target2 ...
      PROPERTIES prop1 value1
      prop2 value2 ...)

add_library: 为生成的库添加源文件,是库的名字,直接写名字即可,不要写lib,会自动加上前缀。 STATIC表示静态库(lib),SHARED表示动态库(so)。

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            source1 [source2 ...])

option: 提供一个选项是OFF或者ON,如果没有初始值被提供则默认使用OFF。

option(<option_variable> "help string describing option"
      [initial value])

add_subdirectory: 添加一个编译的子路径,在子路径中查找CMakeLists.txt文件,并进行编译。

add_subdirectory(source_dir [binary_dir]
            [EXCLUDE_FROM_ALL])

list:对项目中的所有值构建一个list,然后对变量进行操作。

list(LENGTH <list> <output variable>)
list(GET <list> <element index> [<element index> ...]
<output variable>)
list(APPEND <list> [<element> ...])
list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)
list(FIND <list> <value> <output variable>)
list(INSERT <list> <element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)

target_link_libraries:对目标进行链接操作,如果有需要链接的库文件的时候才进行操作,如果该项目没有库文件,则不需要该命令。该命令一般在add_executable后面。

target_link_libraries(<target> ... <item>... ...)

(4)使用CMake进行编译

CMake在生成文件的过程中会生成很多中间缓存文件,为了使项目更简洁,文件路径更清楚,一般会在项目的root目录下建立一个文件夹,用于存储CMake生成的中间文件。而一般使用的文件家名称为build或者release。下面是使用命令:

# 进入项目的root目录,本文为:tutorial_first
cd tutorial_first

# 创建存储缓存文件的文件夹,build
mkdir build

# 使用CMake命令生成makefile文件
cmake ..

# 使用make命令进行编译
cmake --build .

实时分享CVPR、ECCV等会议,关注深度学习、自动驾驶领域,我们期待你的加入。点击上方“CNNer”,选择加“星标”或“置顶”精选干货,当日达。
在这里插入图片描述

长按加微信▲

在这里插入图片描述

长按关注▲
备注:研究方向+地点+学校/公司+昵称,更快通过申请,长按加细分领域技术交流群,目前有细分领域:图像分割、图像目标检测、论文写作、车道检测、模型优化、目标跟踪、SLAM、点云处理(分割检测)、深度学习。

PS:腾讯最近更改公众号推送规则,文章推送不在按照时间排序,而是通过智能推荐算法有选择的推送文章,为了避免收不到文章,看完文章您可以点击一下右下角的"在看",以后发文章就会第一时间推送到你面前。

获取完整工程代码,公众号回复:CMakeDemo3

声明:文章来自于网络,仅用于学习分享,版权归原作者所有,侵权请加上文微信联系删除。

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

[CMake教程](四)CMake 配置生成lib或者so的库文件 的相关文章

  • socket封装HTTP请求

    之前写过两个socket封装的HTTP GET请求 xff0c 可是知其然 xff0c 不知所以然 这次写POST请求就有点懵逼了 还是从大佬的文章出发 xff1a https blog csdn net a19881029 article
  • access中,如何删除不可见空格

    1 可以使用 Trim 函数 xff0c 删除字符串 首 尾 的正常空格 span class token keyword update span 表名 span class token keyword set span 字段 span c
  • Raspberry Pi树莓派分类和其相似产品介绍

    文章目录 前言一 1代树莓派二 2代树莓派三 3代树莓派四 4代树莓派五 树莓派Pico六 目前可替代板子介绍引用 前言 树莓派官网 作为小型计算机的代表 xff0c 树莓派可是作为开山鼻祖 xff0c 本文聊一下目前树莓派几代板子发展历程
  • ARM汇编指令ldr和MOV的区别

    1 八位图 数据 2 MOV指令 MOV指令可以把立即数或者寄存器内容 xff08 注意 xff1a 这里绝对不可以是内存 xff01 xff01 xff09 传递给一个寄存器 MOV对于立即数是有要求的 xff0c 就是上边的 8位图 数
  • GPS NEMA 0183协议

    一 NMEA0183标准语句 GPS常用语句 GPGGA 例 xff1a GPGGA 092204 999 4250 5589 S 14718 5084 E 1 04 24 4 19 7 M 0000 1F 字段0 xff1a GPGGA
  • 使用setvbuf更改printf的默认buffer 行为

    有3种buffer行为 xff0c 不缓冲 xff0c 基于块的缓冲 和 基于行的缓冲 stdout xff08 printf xff09 默认是基于行的缓冲 xff0c 即写到stdout的字符都会被缓冲起来直到一个换行符输出的时候 xf
  • linux 下 tcpdump详解 后篇(自己实现抓包过滤)

    一 概述 在了解了tcpdump的原理后 xff0c 你有没有想过自己去实现抓包过滤 xff1f 可能你脑子里有个大概的思路 xff0c 但是知道了理论知识 xff0c 其实并不能代表你完全的理解 只要运用后 xff0c 你才知道哪些点需要
  • 结构体与共同体(联合体)的妙用

    结构体与共同体 xff08 联合体 xff09 的妙用 学习过C语言后 xff0c 大家都了解了结构体与共同体 两者之间的区别是 xff1a 共同体 xff1a 使几个不同类型的变量共占一段内存 相互覆盖 所占内存长度是各最长的成员占的内存
  • [北力电子] 无人机4G图传数传一体 pixhawk mavlink GSLINK 720P

    随着无人机和4G技术的发展 xff0c 实时监看空中视角的画面已经成为可能GSLINK突破传统的传输方式 xff0c 利用了4G网络将数据和视频流融为一体进行无限距离的传输 用户使用EC2地面站 xff08 Mission Planner
  • C#笔记(基础篇)

    简介 第一次发博客 xff0c 欢迎交流沟通 因为学习虚拟现实需要所以暑假一个月学了点C xff0c 做了笔记 xff0c 在这进行分享 xff0c 欢迎浏览 有些代码打在VS中 没有记录在笔记里 请见谅 xff08 视频指路 xff09
  • 《机器人操作系统(ROS)浅析》笔记

    机器人操作系统 xff08 ROS xff09 浅析 这是看了 A Gentle Introduction to ROS 这本书后记的笔记 xff0c 网上刚好找得到中文版的 xff0c 就看中文版了 xff0c 欢迎大佬批评指正 xff0
  • 搭建ROS小车——硬件购买篇(基于arduino mega2560,L298N)

    在寒假期间完成了ROS小车的制作 xff0c 记录一下 xff0c 不过也有很多不足 xff0c 之后再进行修正 xff0c 本系列文章将分为硬件购买篇 下位机篇 上位机篇 功能拓展篇四个部分来进行讲解 上位机 树莓派3B 43 16GBS
  • 搭建ROS小车——上位机篇(基于arduino mega2560,L298N)

    环境 上位机为树莓派3B 43 环境 xff1a ubuntu mate16 04 43 ros kineticros master在电脑上 xff0c 环境为ubuntu18 04 43 ros melodic 考虑到之后可能会拓展别的功
  • R语言入门学习

    R语言 视频链接 xff1a https www bilibili com video BV19x411X7C6 数据分析过程 数据采集 数据存储 数据分析 数据挖掘 数据可视化 进行决策 1 Rstudio使用 1 1 入门 TAB补齐
  • IO多路复用实现TCP并发服务器(select)

    大致描述一下 先定义 fd set 要监视的读事件readfds xff0c FD SET将sockfd放到readfds事件里 xff0c 更新文件最大描述符 xff0c select函数返回值是返回准备好的文件描述符个数 xff08 这
  • 网页中播放RTSP(2) H5Stream

    总的思路是全面的7种方法 xff0c RTSP转换成RTMP WebSocket WebRTC HLS xff0c 再从网页中获取 而这个转换过程 xff0c 就是一个视频服务器端 xff0c 通过视频服务器软件转换RTSP为其他协议格式
  • 固态硬盘在IDE、AHCI模式下的速度对比

    AHCI全名 Advanced Host Controller Interface xff0c 中译 xff1a 高级主机控制接口 xff0c 它是 Intel 所主导的一项技术 xff0c 可以发挥SATA硬盘的潜在加速功能 xff0c
  • Win10 64位双系统UEFI官网下载镜像安装(不用PE)

    1 刻录Win10 ISO镜像 2 U盘UEFI启动 先设置BIOS xff0c Boot Mode xff1a UEFI Secure Boot OFF 3 在 要安装的语言 界面 xff0c 按shift 43 F10调出DOS窗口 4
  • FreeRTOS实验一:portYIELD_FROM_ISR()任务切换的时机分析

    分析下portYIELD FROM ISR 任务切换的时机 span class token keyword void span span class token function HAL UART RxCpltCallback span
  • HAL_DMA_IRQHandler()代码详细分析

    这里使用ADC1联动DMA1 xff0c 开启半传输中断 传输中断 debug时 xff0c dma也一直在工作 xff0c 所以半传输中断 传输中断会同时生效 1 adc1使用了DMA1 Stream0 xff0c Instance表示如

随机推荐

  • AD单层显示

    1 Shift 43 S实现的单层效果 xff08 其他曾黑白显示 xff09 2 隐藏其他层 xff0c 只显示一层 xff0c 这样显示直观 xff0c 效果更好
  • 解决Windows更新失败(0x8007000d)的详细方法

    Window更新时 xff0c 一直处于 正在准备windows xff0c 请不要关闭你的计算机 xff0c 时间太长了 xff0c 直接重启 xff0c 再进系统发现这样子了 此代码表示有需要更新的文件丢失或损坏 管理员方式运行cmd
  • A320M HDV 4.0主板用CH341A手动刷BIOS支持5600g,内存不兼容问题排查

    电脑从AMD 3200g 升级到5600g xff0c 主板使用的是华擎A320m HDV R4 0 xff0c BIOS从7 20开始支持5600g xff0c 在没有CPU情况下只能使用BIOS烧录器手动烧录最新BIOS文件 xff0c
  • keil4中增加新器件(厂家未提供keil4支持包)编辑CDB文件

    1 C Keil UV4 FMSH cdb CPU 61 IRAM 0x20000000 0x20003FFF IROM 0x0000000 0x001FFFF CPUTYPE Cortex M0 CLOCK 12000000 ELITTL
  • C++编译初步

    C 43 43 编程中相关文件后缀 a静态库 archive C c cc cp cpp cxx c 43 43 C 43 43 源代码 xff08 需要编译预处理 xff09 hC或者C 43 43 源代码头文件 iiC 43 43 源代
  • 使用VSCode编辑与编译WSL2下源代码

    1 安装WSL2 2 windows下安装VSCode 3 VSCode安装插件Remote Development 北京时间2019年5月3日 xff0c 在 PyCon 2019 大会上 xff0c 微软发布了 VS Code Remo
  • WSL2编译IMX6ULL裸机程序Win10通过Win32DiskImager烧录SD卡

    1 修改imxdownload c文件 完整代码见附录 gcc mixbin c span class token parameter variable o span mixbin 使用上述gcc命令编译生成mixbin可执行文件 该文件只
  • Windows10 IoT 企业版 LTSC 2021安装应用商店

    https github com kkkgo LTSC Add MicrosoftStore releases tag 2019 解压缩 使用管理员方式运行 Add Store cmd xff0c 等待安装完成 xff0c 亲测可用
  • 2020-06-08

    定义带参数的宏 define JH a b t t 61 a a 61 b b 61 t 对两个 a b的值进行交换 下列表述中 正确的是 A 不定义参数 a 和b 将导致编译错误 B 不定义参数 a b 和 t 将导致编译错误C 不定义参
  • 第一阶段C#串口上位机练习--stm32F4总结

    1 实验目的 掌握上位机编程 xff1b 掌握F4串口 xff1b 掌握两者通信数据帧的约定 xff1b 2 实验设备 stm32F4核心板 xff0c Lcd屏幕 xff0c 下载器 xff0c 电脑 3 完成的任务 xff08 1 xf
  • STM32F103同时使用串口2、串口3

    STM32F103同时使用串口2 串口3 步骤rs485 crs485 h中断处理函数 xff1a 一直在用STM32F103做项目 xff0c 记录一下 xff0c 如果觉得有用的 xff0c 也可以参考一下 步骤 IO口的初始化 xff
  • 方法区位置的演变

    Jvm内存 xff1a 方法区位置的演变 xff1a Jdk1 6时 xff0c 方法区在堆中 xff0c 运行时常量池在方法区中 1 6之前 xff0c 方法区称为永久代 1 8之后 xff0c 方法区称为元空间 真正的实现要么是方法区要
  • 线程如何在底层执行指令?

    一条线程是如何执行的呢 一条线程它有自己独立的栈和pc寄存器 xff0c 寄存器的作用来存储字节码指令地址 xff0c 它来告诉电脑要执行的下一条指令 我们通过main方法反编译出来的代码 xff0c 来详细的探究main线程执行方法中代码
  • 在Linux中如何查看文件的修改日期

    有时候可能需要检查有关文件的详细信息 xff0c 例如文件的修改日期 当你要检查文件的最后编辑时间时 xff0c 本文可能会派上用场 在本文将学习4种方法查看文件的修改日期 使用stat stat 可以显示文件属性的详细信息 xff0c 比
  • 对象的组成

    对象有两种情况 xff1b 普通对象有3部分组成 1 对象头 对象头有两部分 xff1a 1是markword xff0c 2是klass pointer 类型指针 2 示例数据 3 对齐填充 数组对象有4部分组成 1 对象头 对象头有两部
  • 符号引用&直接引用

    符号引用不会加载到虚拟机内存中 xff0c 而直接引用是在内存中的 符号引用 xff1a 在java中 xff0c 一个java类会变编译为字节码文件 xff0c 在编译时 xff0c java类并不知道所引用类的实际地址 也就是直接引用
  • 大端序发送数据

    需要发送数字 151510 大端序发送就是 xff1a 00 02 4F D6 string smallData 61 textBox1 Text 小端数据 if smallData 61 61 34 34 MessageBox Show
  • DSP28335笔记--SCI篇

    采用FIFO来实现数据的发送与接收 xff0c 一般就是指采用FIFO中断 在标准SCI模式下通过中断方式来接收或者发送数据可以发现 xff0c 每接收或者发送一个字符就要进一次中断 xff0c 如果发送的字符比较多的话 xff0c 很明显
  • 无人机实验笔记(2019电赛)

    刚看到题目的时候自然想到的是巡空中电缆线 思路 xff1a 用一个摄像头架高在无人机上 xff0c 与地理坐标Z成一定角度 如图 xff0c 无人机看到的电缆线是实际电缆线在地面上的投影 xff0c 而投影线在 无人机视野的位置 和 无人机
  • [CMake教程](四)CMake 配置生成lib或者so的库文件

    CMake教程 xff08 四 xff09 CMake 配置生成lib或者so的库文件 xff08 1 xff09 系列教程介绍 上面几个教程我们的程序都是生成可执行文件 但是我们在合作开发算法的时候经常需要交付的是一个模块 xff0c 该