如何使用 CMake 来构建一个共享库(动态库)

news2024/11/16 8:45:15

tutorial_4/CMakeLists.txt

# 声明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )

# 声明一个 cmake 工程
project( HelloSLAM )

add_subdirectory(src)

tutorial_4/src/CMakeLists.txt

#工程添加多个特定的头文件搜索路径
include_directories(include)

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 共享库
add_library( tutorial_4 SHARED tutorial_4.cpp)

tutorial_4/src/tutorial_4.cpp

//这是一个库文件
#include <iostream>
using namespace std;


/**
 * 代码作者:小秋SLAM实战教程
 * 开发环境:Ubuntu 16.04
 * 运行依赖:C++ 11
 */

void printHello()
{
    std::cout<<"小秋SLAM实战教程"<<std::endl;
}


tutorial_4/src/tutorial_4.h

#ifndef LIBHELLOSLAM_H_
#define LIBHELLOSLAM_H_
// 上面的宏定义是为了防止重复引用这个头文件而引起的重定义错误

void printHello();

#endif

add_library( tutorial_4 SHARED tutorial_4.cpp )
“tutorial_4”是生成共享库的名字,“tutorial_4.cpp”是生成共享库的文件。
共享库的名字会默认加上前缀"lib"和"后缀.so"。
在这里插入图片描述

这个示例展示了如何使用 CMake 来构建一个共享库(动态库)。在此项目中,共享库是由 tutorial_4.cpp 源文件构建的,并将输出到项目目录下的 lib 子目录中。下面是详细的文件解释和构建过程:

项目的结构如下所示:

/tutorial_4
|-- CMakeLists.txt
|-- /src
    |-- CMakeLists.txt
    |-- tutorial_4.cpp
    |-- tutorial_4.h

根目录的 CMakeLists.txt

位于 tutorial_4CMakeLists.txt 文件负责整个项目的顶级配置。

cmake_minimum_required(VERSION 2.8)
project(HelloSLAM)
add_subdirectory(src)

这个文件设置了 CMake 的最低版本要求,定义了项目名称,并添加了 src 子目录到构建中。

src 目录的 CMakeLists.txt

位于 tutorial_4/srcCMakeLists.txt 文件用于配置源代码目录,并生成共享库。

include_directories(include)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
add_library(tutorial_4 SHARED tutorial_4.cpp)
  • include_directories(include):包含头文件的目录。
  • set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib):设置库文件的输出路径为项目根目录下的 lib 文件夹。
  • add_library(tutorial_4 SHARED tutorial_4.cpp):创建一个名为 tutorial_4 的共享库(动态库),源文件为 tutorial_4.cpp

tutorial_4.cpp 和 tutorial_4.h

tutorial_4.cpptutorial_4.h 定义了一个简单的函数 printHello,该函数打印一条消息。

构建过程

  1. 创建一个构建目录:在项目根目录中创建一个新目录,例如 build,用于存放构建文件。

  2. 运行 CMake:从 build 目录运行 cmake .. 命令以生成 Makefile。

  3. 编译项目:在 build 目录中运行 make 命令来编译项目。

  4. 检查生成的库:生成的共享库 libtutorial_4.so 将位于 lib 目录中。

总结

这个示例展示了如何使用 CMake 创建一个共享库(动态库)。通过在 CMakeLists.txt 文件中指定库的类型和源文件,CMake 可以自动处理编译过程,生成共享库文件。共享库适用于那些需要动态加载或节省内存空间的应用场景。这种方法对于管理大型项目中的库非常有用,因为它提供了清晰和灵活的方式来组织代码。

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

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

相关文章

静态路由、代理ARP

目录 静态路由静态路由指明下一跳和指明端口的区别代理ARP 我们知道&#xff0c;跨网络通信需要路由 路由有三种类型&#xff1a; 1.直连路由。 自动产生的路由&#xff0c;当网络设备连接到同一网络时&#xff0c;他们可以自动学习到对方的存在。自动学习相邻网络设备的直连信…

python编程从入门到实践(3+4)操作列表+if语句

文章目录 第四章 列表操作4.1遍历整个列表&#xff1a;可能会发生变化的数值&#xff0c;列表可修改4.1.2遍历中的缩进 4.3创建数值列表4.3.1 使用range&#xff08;&#xff09;函数range&#xff08;i&#xff0c;m&#xff09;输出从i到m-1range(m) 打印从0到m-1 4.3.1 使用…

Java集合框架概念详解

目录 1. 什么是Java集合框架&#xff1f;2. 常用接口介绍3. 常用实现类介绍4. 集合框架的应用场景 前言&#xff1a; Java集合框架是Java编程中最重要的工具之一。它提供了一套强大而灵活的数据结构和算法&#xff0c;用于存储和操作数据。本文将详细介绍Java集合框架的概念、常…

数据结构—环形缓冲区

写在前面&#xff0c;2023年11月开始进入岗位&#xff0c;工作岗位是嵌入式软件工程师。2024年是上班的第一年的&#xff0c;希望今年收获满满&#xff0c;增长见闻。 数据结构—环形缓冲区 为什么要使用环形数组&#xff0c;环形数组比起原来的常规数组的优势是什么&#xf…

CLIP is Also an Efficient Segmenter

表1 复现结果–Seed&#xff1a;70.7245673447014&#xff0c;dCRF&#xff1a;74.85437742935268 误差小于0.5个点&#xff0c;可以接受 表4 复现结果–训练300轮&#xff0c;Val&#xff1a;58.76741354153312&#xff0c;Test&#xff1a;59.18210 感想 VOC全部复现完成&…

spring事务默认传播机制REQUIRED的试验(手动开启事务代码+feign远程调用)

transactional注解&#xff0c;默认啥都不指定的时候&#xff0c;我们使用的就是PROPAGATION_REQUIRED这种方式。 PROPAGATION_REQUIRED:业务方法需要在一个事务中运行&#xff0c;如果方法运行时&#xff0c;已处在一个事务中&#xff0c;那么就加入该事务&#xff0c;否则自…

Linux操作系统基础(12):Linux的Shell解释器

1. Shell的介绍 在Linux中&#xff0c;Shell 是一种命令行解释器&#xff0c;它是用户与操作系统内核之间的接口&#xff0c;它负责解释用户输入的命令&#xff0c;并将其转换成系统调用或其他操作系统能够执行的指令。 Shell 提供了一种交互式的方式来与操作系统进行通信&am…

关于使用统一服务器,vscode和网页版jupyter notebook的交互问题

autodl 查看虚拟环境 在antodl上租借了一个服务器&#xff0c;通过在网页上运行jupyter notebook和在vscode中运行&#xff0c;发现环境都默认的是miniconda3。 conda info --envs 当然环境中所有的包都是一样的。 要查看当前虚拟环境中安装的所有包&#xff0c;可以使用以…

C++流媒体服务器 ZLMediaKit框架ZLToolKit源码解读

ZLMediaKit是国人开发的开源C流媒体服务器&#xff0c;同SRS一样是主流的流媒体服务器。 ZLToolKit是基于C11的高性能服务器框架&#xff0c;和ZLMediaKit是同一个作者&#xff0c;ZLMediaKit正是使用该框架开发的。 ZLMediaKit开源地址&#xff1a;https://github.com/ZLMedi…

CP_AutoSar目录

目录 一、RTE二、模式和状态管理三、BSW四、工具链相关五、杂项六、优化相关 一些笔记和日常记录。有部分未包含在此目录中。 一、RTE [AutoSar]基础部分 RTE 01 介绍 [AutoSar]基础部分 RTE 02 S/R Port 显式/隐式 [AutoSar]基础部分 RTE 03 C/S Port 同步/异步 [AutoSar]基…

VELO维乐携手【晓饰记】创始人胡晓,引领潮流新饰界!

不知道大家还记不记得2023年维乐带着自己满满的诚意闪现英伦时尚之都为全世界带来了一场无与伦比的视觉盛宴&#xff01;而依照维乐固有的执念&#xff0c;从不会让自己止步的精神&#xff0c;维乐又带着自己的维乐坐垫找到了CoCo胡晓&#xff0c;【晓饰记】的首饰品牌创始人、…

Spanner on a modern columnar storage engine 中文翻译

文章目录 0. 摘要1. 存储引擎2. 存储引擎迁移的挑战2.1 可靠性、可用性和数据完整性2.2 性能和成本2.3 复杂性 3. 迁移可靠性的系统原则方法3.1 可靠性原则和自动化架构3.2 迁移方案和按周迁移3.3 客户 部署感知 调度3.4 管理可靠性、可用性和性能 4. 项目管理和驱动指标概括 0…

FastDFS安装与测试

目录 目标 版本 环境 官方文档 相关概念 安装FastDFS 启动FastDFS 关闭FastDFS 重启FastDFS 用命令测试上传文件 用命令测试下载文件 用命令测试删除文件 用HTTP的方式访问FastDFS中的文件 用HTTP的方式访问FastDFS中的文件整体流程 目标 在Linux服务器上搭建单…

brpc之接口Protocol

简介 brpc主要是通过Protocol这个接口来支持多协议的。其提供了解析&#xff0c;序列化&#xff0c;处理请求与响应的函数指针&#xff0c;通过函数指针以达到多态的效果 Protocol 结构体定义如下 struct Protocol {typedef ParseResult (*Parse)(butil::IOBuf* source, So…

Django(六)

员工管理系统(用户管理&#xff09; {% extends layout.html %}{% block content %}<div class"container"><div style"margin-bottom: 10px"><a class"btn btn-success" href"#"><span class"glyphicon gl…

【Unity美术】如何用3DsMax做一个水桶模型

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

《GreenPlum系列》GreenPlum详细入门教程01-GreenPlum介绍

文章目录 第一章 GreenPlum介绍1.MPP架构介绍2.GreenPlum介绍3.GreenPlum数据库架构4.GreenPlum数据库优缺点 GreenPlum&#xff1a;https://cn.greenplum.org/ 第一章 GreenPlum介绍 1.MPP架构介绍 MPP是Massively Parallel Processing的缩写&#xff0c;也就是大规模并行处…

大数据 - Doris系列《一》- Doris简介

目录 &#x1f436;1.1 Doris 概述 &#x1f436;1.2 OLAP和OLTP&#xff08;面试&#xff09; 1. 应用场景 &#x1f959;联机事务处理OLTP(On-Line Transaction Processing) &#x1f959;联机分析处理OLAP(On-Line Analytical Processing) 2. OLAP和OLTP比较--“用户行…

WEB 3D技术 three.js 元素居中与获取元素中心点

本文 我们来说让物体居中 以及获取它的中心点 我们上文留下的这个代码 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; import { RGBELoader } from "three/e…

跑腿配送系统技术探析

概述 跑腿配送系统是一种基于现代科技的服务平台&#xff0c;通过智能化的技术手段&#xff0c;实现用户需求的快速响应和高效配送。本文将探讨该系统的核心技术原理&#xff0c;以及在实际开发中的一些代码示例。 技术原理 1. 用户请求与任务分配 跑腿配送系统的第一步是…