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

CMake学习--如何在CMake中编译静态库、动态库并在主程序中调用

目录

    • 一、背景知识
    • 二、使用方法
      • (一)编译静态库
      • (二)编译动态库
      • (三)在主程序中调用库
    • 三、总结

一、背景知识

在C/C++开发中,库(Library)是预先编译好的代码集合,可供多个程序使用。根据链接方式不同,库分为静态库和动态库。静态库在编译时将代码直接链接到可执行文件中,可执行文件体积较大,但运行时无需额外库文件;动态库在运行时加载,可执行文件体积小,便于更新和共享,但依赖外部库文件存在。

CMake是一个跨平台的自动化构建工具,通过编写CMakeLists.txt文件来定义项目的构建规则,可以方便地编译静态库、动态库以及主程序,并处理它们之间的依赖关系。

二、使用方法

(一)编译静态库

  1. 创建项目目录结构

math作为库项目, app作为测试项目

文章配图

  1. 编写math目录下的文件
  • my_math.cpp
#include "my_math.h"int add(int a, int b) {return a + b;
}int subtract(int a, int b) {return a - b;
}
  • my_math.h

#ifndef MATH_FUNCTIONS_H#define MATH_FUNCTIONS_Hint add(int a, int b);int subtract(int a, int b);#endif
  • math/CMakeLists.txt

# 设置这个目录项目的最低版本cmake_minimum_required(VERSION 3.10)# 定义一个静态库 mathadd_library(math STATIC my_math.cpp)# 设置头文件公共目录,方便其他模块包含target_include_directories(math PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
  1. 编写app目录下的文件
  • main.c

#include <stdio.h>#include "../math/my_math.h"int main() {int sum = add(1, 2);int difference = subtract(4, 2);printf("Sum: %d\n", sum);printf("Difference: %d\n", difference);return 0;
}
  • app/CMakeLists.txt

cmake_minimum_required(VERSION 3.10)# 定义一个可执行文件add_executable(DemoApp main.cpp)# 链接 math 静态库target_link_libraries(DemoApp PRIVATE math)
  1. 编写项目根目录下的CMakeLists.txt

cmake_minimum_required(VERSION 3.10)project(DemoProject VERSION 1.0)# 添加 math 目录add_subdirectory(math)# 添加 app 目录add_subdirectory(app)
  1. 构建项目
    在项目根目录下打开终端,执行以下命令:

mkdir buildcd buildcmake ..cmake --build .

(二)编译动态库

  1. 创建项目目录结构同静态库部分。

  2. 修改math目录下的math/CMakeLists.txt


cmake_minimum_required(VERSION 3.10)# 定义一个动态库 mathadd_library(math SHARED my_math.cpp)# 设置动态库的公共头文件位置target_include_directories(math PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
  1. app目录下的文件无需修改。

  2. 项目根目录下的CMakeLists.txt无需修改。

  3. 构建项目同静态库部分。

构建完成后,运行生成的DemoApp前,确保动态库对于可执行文件是可见的。在Linux或macOS上,可能需要设置环境变量LD_LIBRARY_PATH或DYLD_LIBRARY_PATH。

(三)在主程序中调用库

在主程序中调用库中的函数,只需包含相应的头文件,并使用函数即可。如上述main.cpp中的代码,通过包含my_math.h头文件,就可以使用add和subtract函数。

三、总结

通过CMake,我们可以方便地编译静态库和动态库,并在主程序中调用。静态库适合代码量不大且需要保证代码安全的场景,动态库适合代码量大且需要共享的场景。在实际项目中,根据需求选择合适的库类型,并合理组织项目结构,可以提高代码的可维护性和可扩展性。

相关文章:

CMake学习--如何在CMake中编译静态库、动态库并在主程序中调用

目录 一、背景知识二、使用方法&#xff08;一&#xff09;编译静态库&#xff08;二&#xff09;编译动态库&#xff08;三&#xff09;在主程序中调用库 三、总结 一、背景知识 在C/C开发中&#xff0c;库&#xff08;Library&#xff09;是预先编译好的代码集合&#xff0c…...

安美数字酒店宽带运营系统存在SQL注入漏洞

免责声明&#xff1a;本号提供的网络安全信息仅供参考&#xff0c;不构成专业建议。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权&#xff0c;请及时与我联系&#xff0c;我将尽快处理并删除相关内容。 漏洞描述 安美数字酒店宽带运营系统的lang…...

中级:Git面试题全攻略

一、引言 在现代软件开发中&#xff0c;Git作为分布式版本控制系统&#xff0c;被广泛应用于代码管理与团队协作。面试官通过Git相关问题&#xff0c;考察候选人对版本控制的基本概念、操作流程以及解决实际问题的能力。本文将深入解读Git的基本操作、分支管理、冲突解决等常见…...

ubuntu18 server版花屏问题

新搞了一台dellT150的塔式服务器&#xff0c;装的ubuntu18 server版。 开机后遇到花屏&#xff0c;或者卡在开机界面的问题&#xff0c;和售后技术沟通这个情况是ubuntu自带的显卡驱动包兼容问题。需要做如下设置&#xff1a; 解决&#xff1a; 1.开机&#xff0c;连续按下e…...

基于神经网络的肾脏疾病预测模型

构建一个基于神经网络的肾脏疾病预测模型 1. 数据预处理 ​加载数据&#xff1a;读取 kidney_disease.csv 文件&#xff0c;加载患者医疗数据。​删除冗余特征&#xff1a;移除与预测目标无关的列&#xff08;如 al, su 等&#xff09;&#xff0c;保留关键特征&#xff08;如…...

Oracle常用高可用方案(10)——RAC

10.2. RAC 10.2.1. 概念 RAC,Real Application Cluster的缩写,业界就称为RAC。RAC最早出现于2001年发布的Oracle 9i版本,之前的版本中,也有类似的产品或技术,叫做OPS,即Oracle Parallel Server的缩写。基于多方面的因素,Oracle 9i之前的类似产品或技术并没有得到广泛应…...

JavaScript基础-移动端常用开发插件

在移动Web开发中&#xff0c;为了提升开发效率和用户体验&#xff0c;开发者通常会依赖于一些成熟的JavaScript插件。这些插件封装了复杂的功能&#xff0c;使得实现常见的交互效果变得更加简单快捷。本文将介绍几款广泛使用的移动端开发插件&#xff0c;并通过具体的示例展示它…...

I/O多路复用 + Reactor和Proactor + 一致性哈希

网络系统 1. I/O多路复用1&#xff09;原始Socket模型通信方式2&#xff09;多进程模型3&#xff09;多线程模型4&#xff09;I/O多路复用select/pollepoll边缘触发和水平触发 2. Reactor和Proactor1&#xff09;Reactor模式2&#xff09;Reactor模式四种方案3&#xff09;单Re…...

解决小程序video控件在真机和上线后黑屏不播放问题

小程序上线后&#xff0c;mp4格式的视频无法点击是黑屏&#xff0c;但是测试得时候在微信开发者工具中能够打开正常播放 原因&#xff1a;编码格式不能是vp9 微信开发者工具本地设置中把这个打开勾选。 排查&#xff1a;可以换一个视频尝试能不能真机播放&#xff0c;如果能&a…...

js中判断对象是否包含某个属性(元素)

在JavaScript中&#xff0c;判断对象是否包含某个属性&#xff08;元素&#xff09;主要有以下几种方法&#xff0c;根据具体需求选择合适的方式&#xff1a; 1. 使用 in 运算符 作用&#xff1a;检查对象自身及原型链上是否存在指定属性。 示例&#xff1a; javascript cons…...

数据库6(数据库指令)

之前所学的指令均为查找指令&#xff0c;即select相关语句 接下来的语句是增删改查的其他三部分&#xff0c;即增删改 1.删除 删除操作是三个操作中较为简单的&#xff0c;因为它只需要考虑数据的完整性 在实验时可以用表的复件来操作&#xff0c;防止操作不当导致数据库被…...

[C++面试] 智能指针面试点(重点)续4

[C面试] RAII资源获取即初始化&#xff08;重点&#xff09;-CSDN博客 [C面试] 智能指针面试点&#xff08;重点&#xff09;-CSDN博客 [C面试] 智能指针面试点&#xff08;重点&#xff09;续1-CSDN博客 [C面试] 智能指针面试点&#xff08;重点&#xff09;续2-CSDN博客 …...

java项目分享-分布式电商项目附软件链接

今天来分享一下github上最热门的开源电商项目安装部署&#xff0c;star 12.2k&#xff0c;自行安装部署历时两天&#xff0c;看了这篇文章快的话半天搞定&#xff01;该踩的坑都踩完了&#xff0c;软件也打包好了就差喂嘴里。 项目简介 mall-swarm是一套微服务商城系统&#xf…...

16变量命名风格

给变量/函数/文件/类 起名字, 非常有讲究的~~ 1.起的名字要有描述性.不要使用 abc,xyz 这种比较无规律的名字来描述 2.如果名字比较长,由多个单词构成的,就需要使用适当的方式来进行区分不同单词 C中,偏好使用_来进行单词的分割. 形如: student_count(变量) unordered_map(stl容…...

【LVS】负载均衡群集部署(DR模式)

部署前IP分配 DR服务器&#xff1a;192.168.166.101 vip&#xff1a;192.168.166.100 Web服务器1&#xff1a;192.168.166.104 vip&#xff1a;192.168.166.100 Web服务器2&#xff1a;192.168.166.107 vip&#xff1a;192.168.166.100 NFS服务器&#xff1a;192.168.166.108 …...

链表的操作-反转链表

链表 160相交链表 代码 class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode* h1headA;ListNode* h2headB;while(h1&&h2){if(h1!h2){h1h1->next;h2h2->next;}else{return h1;}}if(h1nullptr){h1headB;}else{h…...

Linux安装Cmake (Centos 7.9)

cmake安装 这个虽然已经更新到了4.0.0版本了&#xff0c;但是我们要用3.5版本的&#xff0c;因为这个比较稳定 官方地址&#xff1a;https://github.com/Kitware/CMake/releases/tag/v3.5.0&#xff0c;选择那个cmake-3.5.0-Linux-x86_64.tar.gz下载&#xff0c; 首先解压文…...

Node.js v22.14.0 多平台安装指南:Windows、Linux 和 macOS 详细教程

Node.js作为现代Web开发的基石&#xff0c;持续为开发者带来性能提升和新特性支持。本文将详细介绍在Windows、macOS和Linux系统上安装最新Node.js的多种方法&#xff0c;助您快速搭建高效的JavaScript开发环境。 &#x1f4e6; 当前最新版本 截至2025年4月&#xff0c;Node.…...

Netty源码—10.Netty工具之时间轮一

大纲 1.什么是时间轮 2.HashedWheelTimer是什么 3.HashedWheelTimer的使用 4.HashedWheelTimer的运行流程 5.HashedWheelTimer的核心字段 6.HashedWheelTimer的构造方法 7.HashedWheelTimer添加任务和执行任务 8.HashedWheelTimer的完整源码 9.HashedWheelTimer的总结…...

C++虚函数与抽象类

一、虚函数 &nbsp**;类中定义不同类中的同名函数的多态的行为**&#xff0c;主要是通过虚函数来实现。 在类的成员函数前加virtual关键字。虚函数是实现包含多态的基础。这里需要说明的是当基类里有虚函数且派生类中重新声明了和基类虚函数相同的函数&#xff0c;那…...

鸿蒙项目笔记(1)

一、核心内容-商城 1、装饰器的拓展使用&#xff0c;基础组件的熟悉。 2、引入基础动画实战&#xff0c;页面属性动画、页面跳转动画、自定义页面翻页等。 3、一次开发&#xff0c;多端部署。 4、本地数据库实战&#xff0c;涉及多种本地数据存储方式。 5、路由导航&#…...

*快排延伸-自省排序

此节是学有余力的人去看&#xff0c;如果没时间&#xff0c;不看也没关系&#xff0c;只要知道代码就可以了&#xff01; 自省排序的思路是自我侦测和反省&#xff0c;快速排序如果递归深度太深&#xff0c;其算法的效率可能被大幅度削弱&#xff0c;这就需要借助其他的算法进…...

三.微服务架构中的精妙设计:服务注册/服务发现-Eureka

一.使用注册中心背景 1.1服务远程调用问题 服务之间远程调⽤时, 我们的URL是写死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 缺点&#xff1a; 当更换机器, 或者新增机器时, 这个URL就需要跟着变更, 就需要去通知所有的相关服…...

python-leetcode 63.搜索二维矩阵

题目&#xff1a; 给一个满足两条属性的m*n的整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列 每行的第一个整数大于前一行的最后一个整数 给一个整数target,如果target在矩阵中&#xff0c;返回true,否则返回false 方法一&#xff1a;两次二分查找 由于每…...

后端框架入门:Django

Django 基础:模型、视图、模板Django REST Framework 的使用一、Django 概述 Django 是一个 高效、灵活、可扩展 的 Python Web 框架,主要用于快速开发 Web 应用 和 REST API。 📌 Django 的优势: ✅ MTV 架构:模型(Model)、视图(View)、模板(Template)分离,便于…...

从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.3.2知识库增强与外部API集成(代码示例:HTTP节点与检索增强生成)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 知识库增强与外部API集成:HTTP节点与检索增强生成实战4.3.2 知识库增强与外部API集成(代码示例:HTTP节点与检索增强生成)1. 核心挑战与优化目标1.1 技术瓶颈分析1.2 设计目标2. 关键技术方案2.1 知识…...

音视频入门基础:MPEG2-TS专题(26)——通过FFmpeg命令使用RTP发送TS流

音视频入门基础&#xff1a;MPEG2-TS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;1&#xff09;——MPEG2-TS官方文档下载 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ts文件 音视频入门基础…...

blender二次元上色

前&#xff1a; 后&#xff1a;&#xff08;脸自己会发光) 参考&#xff1a;05-模型导入与材质整理_哔哩哔哩_bilibili...

2025年2月一区SCI-壮丽细尾鹩莺算法Superb Fairy-wren Optimization-附Matlab免费代码

引言 本期介绍一种新的元启发式算法——壮丽细尾鹩莺优化算法Superb Fairy-wren Optimization algorithm&#xff0c;SFOA。该算法结合了壮丽细尾鹩莺群体中幼鸟的发育&#xff0c;繁殖后喂养幼鸟的行为&#xff0c;以及它们躲避捕食者的策略&#xff0c;于2025年2月最新发表在…...

Linux系统禁用swap

Linux系统禁用swap sed -ri s/.*swap.*/#&/ /etc/fstab大家之前禁用swap用上面的命令&#xff0c;也就是把"/etc/fstab"文件里包含swap的那行注释了&#xff0c;然后重启系统swap就被禁用了。 可是到了Ubuntu 20.04之后、CentOS Stream 10、openEuler 24.04、O…...