如何使用 CMake 生成一个静态库

文章目录

    • tutorial_3/CMakeLists.txt
    • tutorial_3/src/CMakeLists.txt
    • cmake_tutorial/tutorial_3/src/hello.cpp
    • tutorial_3/src/hello.h
    • 根目录的 CMakeLists.txt
    • src 目录的 CMakeLists.txt
    • hello.cpp 和 hello.h
    • 构建过程
    • 总结

tutorial_3/CMakeLists.txt

cmake_minimum_required(VERSION 2.8.4)project(tutorial_3)add_subdirectory(src)

tutorial_3/src/CMakeLists.txt

include_directories(include)set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)add_library( tutorial_3 STATIC hello.cpp)

cmake_tutorial/tutorial_3/src/hello.cpp

#include "hello.h"
void hello_func(void) {std::cout<<"小秋SLAM代码实战笔记"<<std::endl;return;
}

tutorial_3/src/hello.h


#ifndef HELLO_H_
#define HELLO_H_ (1)#include <iostream>void hello_func(void);#endif
add_library(<name> [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL]source1 [source2 ...])
<name>生成库的名字,直接写名字不加`lib`,会自动加上前缀。
SHARED动态库 
STATIC静态库ADD_LIBRARY(hello SHARED hello.c)
ADD_LIBRARY(hello STATIC hello.c)

add_library( hello hello.cpp)
“hello”是生成静态库的名字,“Hello.cpp”是生成静态库的源文件。
静态库的名字会默认加上前缀"lib"和"后缀.a",静态库/动态库只是后缀名不同而已
在这里插入图片描述

这个示例展示了如何使用 CMake 生成一个静态库。在这个项目中,静态库由 hello.cpp 源文件构建,并且将输出到项目目录下的 lib 子目录中。以下是详细的文件解释和构建过程:

项目的结构如下所示:

/tutorial_3
|-- CMakeLists.txt
|-- /src|-- CMakeLists.txt|-- hello.cpp|-- hello.h

根目录的 CMakeLists.txt

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

cmake_minimum_required(VERSION 2.8.4)project(tutorial_3)add_subdirectory(src)

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

src 目录的 CMakeLists.txt

位于 tutorial_3/srcCMakeLists.txt 文件用于配置源代码目录,并生成静态库。

include_directories(include)set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)add_library(tutorial_3 STATIC hello.cpp)
  • include_directories(include):包含头文件的目录。这里没有明确的 include 子目录,所以这行可能不是必需的。
  • set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib):设置库文件的输出路径为项目根目录下的 lib 文件夹。
  • add_library(tutorial_3 STATIC hello.cpp):创建一个名为 tutorial_3 的静态库,源文件为 hello.cpp

hello.cpp 和 hello.h

hello.cpphello.h 定义了一个简单的函数 hello_func,该函数打印一条消息。

构建过程

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

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

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

  4. 检查生成的库:生成的静态库 libtutorial_3.a 将位于 lib 目录中。

总结

这个示例展示了如何使用 CMake 创建一个静态库。通过在 CMakeLists.txt 文件中指定库的类型和源文件,CMake 可以自动处理编译过程,生成静态库文件。这种方法对于管理大型项目中的库非常有用,因为它提供了清晰和灵活的方式来组织代码。

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

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

相关文章

Latex + Overleaf 论文写作新手笔记

.tex 文件main.tex 文件 Latex 的文档层次结构不同文档类型的层次结构report 6 层结构实例article 5 层结构实例 Latex 语法图表插入与引用使用 figure 环境来插入图片使用 ref 命令来引用已有的图表格的插入与引用 代码块列表无序列表 itemize有序列表 enumerate 学位论文项目…

DQL命令查询数据(一)

本课目标 理解查询的相关概念 掌握MySQL的简单查询语句 掌握MySQL中的函数 DQL 语言 DQL&#xff08;Data Query Language 数据查询语言&#xff09;&#xff1a;用于查询数据库对象中所包含的数据 DQL语言主要的语句&#xff1a;SELECT语句 DQL语言是数据库语言中最核心…

CSS3(Flex布局详解)

Flex 基本概念&#xff1a; 在 flex 容器中默认存在两条轴&#xff0c;水平主轴(main axis) 和垂直的交叉轴(cross axis)&#xff0c;这是默认的设置&#xff0c;当然你可以通过修改使垂直方向变为主轴&#xff0c;水平方向变为交叉轴&#xff0c;这个我们后面再说。 在容器中…

UseContentHash选项能否在打包AssetBundle时计算可靠的Hash

1&#xff09;UseContentHash选项能否在打包AssetBundle时计算可靠的Hash 2&#xff09;如何清理Native Reserved部分的内存 3&#xff09;Addressables资源完整性校验 4&#xff09;通过Image.color和CanvasRenderer.SetColor修改UI组件颜色的区别 这是第368篇UWA技术知识分享…

[Linux] 一文理解HTTPS协议:什么是HTTPS协议、HTTPS协议如何加密数据、什么是CA证书(数字证书)...

之前的文章中, 已经分析介绍过了HTTP协议. HTTP协议在网络中是以明文的形式传输的. 无论是GET还是POST方法都是不安全的. 为什么不安全呢? 因为: HTTP协议以明文的形式传输数据, 缺乏对信息的保护. 如果在网络中传输数据以明文的形式传输, 网络中的任何人都可以轻松的获取数据…

Java学习苦旅(二十六)——反射,枚举和lamda表达式

本篇博客将讲解反射&#xff0c;枚举和lamda表达式。 文章目录 反射定义用途反射基本信息反射相关的类Class类Class类中相关的方法 反射示例反射的优缺点优点缺点 枚举背景及定义常用方法枚举优缺点优点缺点 Lambda表达式背景语法函数式接口定义基本使用 变量捕获Lambda在集合…

科学的摇篮 - 贝尔实验室

AT&T贝尔实验室&#xff08;AT&T Bell Laboratories&#xff09;是美国电信公司AT&T的研究与开发部门&#xff0c;成立于1925年。它在20世纪的许多年里一直是科学与技术创新的重要中心&#xff0c;做出了众多重大贡献&#xff0c;并为多项科技成就奠定了基础。以下…

Typescript 中创建对象的方式

1.type type MyObj {a: string;b: number;c: () > number; }; 2.interface interface MyObj {a: string;b: number;c: () > number; } 3. class class MyObj {a:string;b:number;c:()>number } // Error: Property staticProperty does not exist on type M.

Spring Boot应用启动时自动执行代码的五种方式

Spring Boot为开发者提供了多种方式在应用启动时执行自定义代码&#xff0c;这些方式包括注解、接口实现和事件监听器。在本篇博客中&#xff0c;我们将探讨一些常见的方法&#xff0c;以及如何利用它们在应用启动时执行初始化逻辑。 1. PostConstruct注解 PostConstruct注解…

嵌入式系统习题(考试相关)

文章目录 上一篇嵌入式系统概述ARM技术概述ARM指令Thumb指令集ARM程序设计 上一篇 嵌入式系统复习–基于ARM的嵌入式程序设计 嵌入式系统概述 嵌入式系统中常用的通信接口包括哪些&#xff1f; RS-232C串行通信接口&#xff0c;RS-422串行通信接口&#xff0c;RS-485串行通信…

【JAVA】Iterator 和 ListIterator 有什么区别?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 在Java中&#xff0c;遍历集合是日常编程中常见的任务&#xff0c;而Iterator和ListIterator作为遍历集合的两个主要接口&#xff0…

application.properties 如何改成 application.yml

Convert YAML and Properties File 右键直接转换即可 Further Reading &#xff1a; idea 常用插件

【两阶段鲁棒】计及需求响应的多能互补微网两阶段鲁棒优化matlab

目录 1 主要内容 算例模型 目标函数 第一阶段 第二阶段 求解流程图 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《多能互补微网两阶段鲁棒优化调度研究》&#xff0c;在考虑风光不确定集的基础上提出采用计及DR响应的多能互补微网两阶段鲁棒备用调度模…

通信触发流程

该示例方案主要介绍如何通过建立的Modbus或TCP通信来实现触发方案、协议解析、发送事件和以及响应配置等功能。 需求&#xff1a;使用Modbus通信触发指定流程运行。 搭建思路&#xff1a;在接收事件中使用协议组装&#xff0c;比较规则选择上升沿&#xff0c;当接收到的值从其…

知识图谱之汽车实战案例综述与前瞻分析

知识图谱的前置介绍 什么是知识图谱 知识图谱本质(Knowledge Graph&#xff09;上是一种叫做语义网络(semantic network &#xff09; 的知识库&#xff0c;即具有有向图结构的一个知识库&#xff1b;图的结点代表实体&#xff08;entity&#xff09;或者概念&#xff08;con…

大数据 Yarn - 资源调度框架

Hadoop主要是由三部分组成&#xff0c;除了前面我讲过的分布式文件系统HDFS、分布式计算框架MapReduce&#xff0c;还有一个是分布式集群资源调度框架Yarn。 但是Yarn并不是随Hadoop的推出一开始就有的&#xff0c;Yarn作为分布式集群的资源调度框架&#xff0c;它的出现伴随着…

Java Base64简单介绍

1. Base64工具 工具链接 2. Base64示例代码 public class Base64Demo {// 请注意&#xff0c;在处理二进制数据时&#xff08;例如图片或文件&#xff09;&#xff0c;不需要将字节数组转换为字符串再进行编码或解码&#xff0c;// 可以直接对字节数组进行Base64操作。上述…

路由器01_工作原理

一、回顾交换机工作原理 交换机里面维护了一张MAC地址表&#xff0c;主要记录的是MAC地址和接口的对应关系。 交换机在初始状态下&#xff0c;MAC地址表是空的&#xff0c;当收到一个来自某接口的数据时&#xff0c;首先查看数据帧中的MAC地址表&#xff0c;对照自己的MAC地址…

在IDEA中使用git分支进行开发然后合并到Master分支,2022.1.x版本

在实际开发过程中&#xff0c;为了避免因为在开发中出现的问题以及方便发布版本&#xff0c;如果是多版本发布的情况相下&#xff0c;我们通常需要采用分支进行开发&#xff0c;这个时候&#xff0c;我们就需要了解git分支的相关知识点了&#xff0c;本篇博客也是博主在实际公司…

【MySQL】MySQL如何查询和筛选存储的JSON数据?

MySQL如何查询和筛选存储的JSON数据&#xff1f; 一、背景介绍二、支持的JSON数据类型三、基础数据3.1 创建表3.2 插入 JSON 数据3.3 查询 JSON 数据 四、操作函数4.1 JSON_OBJECT4.2 JSON_ARRAY4.3 JSON_EXTRACT 一、背景介绍 JSON(JavaScript Object Notation)是一种轻量级的…