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

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_H



int add(int a, int b);

int subtract(int a, int b);



#endif

  • math/CMakeLists.txt

# 设置这个目录项目的最低版本

cmake_minimum_required(VERSION 3.10)



# 定义一个静态库 math

add_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 build

cd build

cmake ..

cmake --build .

(二)编译动态库

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

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


cmake_minimum_required(VERSION 3.10)



# 定义一个动态库 math

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

http://www.dtcms.com/a/108590.html

相关文章:

  • rag精细化测试
  • 论坛系统的测试
  • win10 快速搭建 lnmp+swoole 环境 ,部署laravel6 与 swoole框架laravel-s项目1
  • Docker in Docker(Dind)
  • 深入解析 Git Submodule:从基础到高级操作指南
  • 电子电气架构 --- 控制器级架构
  • 基于HTML5的拖拽排序功能实现详解
  • Dify接口api对接,流式接收流式返回(.net)
  • Java迭代器【设计模式之迭代器模式】
  • C++ 中的类型处理与类型别名(二十六)
  • 车辆选择解决方案
  • 5.模型训练-毕设篇3
  • 字节跳动 UI-TARS 汇总整理报告
  • 核桃派2B:opencv python的 Canny findContours得到两个非常接近的轮廓,角点有几个像素的差距,如何处理?
  • 使用 Flutter 制作地图应用
  • 封装一套通用echats
  • 电子电气架构 --- 域控制器和EE架构关系
  • 时间字段前端VO接收用String,后端用Date
  • 防火墙和端口开关
  • Kafka和RocketMQ零拷贝对比
  • ABeam 德硕 | 中国汽车市场(2)——新能源车的崛起与中国汽车市场机遇与挑战
  • nuxt3 部署到服务器配置
  • 关于 数据库表关联查询(JOIN) 和 子查询(Subquery) 的详细对比,包括定义、语法、优缺点、使用场景及示例代码,并以表格总结关键差异
  • gitblit服务启动报错Cannot assign requested address: bind
  • Spring Boot3使用Spring AI通过Ollama集成deepseek
  • 从技术视角看海外服务器免备案机制——以AWS云为例
  • C#:DispatcherTimer计时器
  • WHAT - 从后端开发的 trace 追踪认识请求的完整流转过程
  • 洛谷 P1032 [NOIP 2002 提高组] 字串变换
  • 第一期:Spring Web MVC 入门 [特殊字符](基础概念 + 环境搭建)