cmake制作并链接动静态库

cmake制作并链接动静态库

  • 制作静态库
    • add_library(库名称 STATIC 源文件1 [源文件2] ...)
    • LIBRARY_OUTPUT_PATH指定库的生成路径
  • 制作动态库
    • add_library(库名称 SHARED 源文件1 [源文件2] ...)
  • 连接动静态库
    • link_libraries连接静态库
    • link_directories到哪个路径去找库
    • target_link_libraries连接动态库
  • find_library

之前我们已经了解了cmake的一些基本操作,如果还有小伙伴不了解cmake是什么,可以点击这里:

(https://blog.csdn.net/qq_67693066/article/details/136658388)[https://blog.csdn.net/qq_67693066/article/details/136658388]

今天我们要了解的如何利用cmake制作动静态库并链接他们:

制作静态库

首先我们先制作一些头文件:
在这里插入图片描述

#pragma once
#include<iostream>

int add(int x,int y);

#pragma once
#include<iostream>

int my_div(int x,int y);

#pragma once
#include<iostream>

int mul(int x,int y);

#pragma once
#include<iostream>

int sub(int x,int y);

然后在对应的cpp文件中实现:
在这里插入图片描述

#include"my_add.h"

int add(int x,int y)
{
    return x + y;
}
#include"my_div.h"

int my_div(int x,int y)
{
    if(y == 0)
    {
        perror("y is zero");
        exit(EXIT_FAILURE);
    }

    return x / y;
}
#include"my_mul.h"

int mul(int x,int y)
{
    return x * y;
}
#include"my_sub.h"

int sub(int x,int y)
{
    return x - y;
}

这里注意一下,我们制作动静态库不需要对应的入口函数,只需要对应头文件和相应的实现。

然后我们编写一个基本的CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)

project(Mylibrary)

aux_source_directory(${PROJECT_SOURCE_DIR}/src MY_SRC) # 在对应的文件下搜索所有的源文件

include_directories(include) # 包括头文件

add_library(库名称 STATIC 源文件1 [源文件2] …)

add_library(库名称 STATIC 源文件1 [源文件2] ...) 

是用来制作静态库的命令:

cmake_minimum_required(VERSION 3.0)

project(Mylibrary)

aux_source_directory(${PROJECT_SOURCE_DIR}/src MY_SRC) # 在对应的文件下搜索所有的源文件

include_directories(include) # 包括头文件


add_library(calc STATIC ${MY_SRC}) # 库名称为calc,源文件从MY_SRC中提取

我们来运行一下:
在这里插入图片描述
这个时候,我们的build目录下会多一个libcalc.a的静态库:
在这里插入图片描述

LIBRARY_OUTPUT_PATH指定库的生成路径

我们可以用LIBRARY_OUTPUT_PATH指定库的生成路径:

cmake_minimum_required(VERSION 3.0)

project(Mylibrary)

aux_source_directory(${PROJECT_SOURCE_DIR}/src MY_SRC) # 在对应的文件下搜索所有的源文件

include_directories(include) # 包括头文件

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) # 库生成在根目录下的lib目录下

add_library(calc STATIC ${MY_SRC}) # 库名称为calc,源文件从MY_SRC中提取

在这里插入图片描述
我们可以到lib目录下找到我们的库文件:
在这里插入图片描述

制作动态库

add_library(库名称 SHARED 源文件1 [源文件2] …)

其实和静态库的方法差不多,只不过把STATIC换成了SHARED:

cmake_minimum_required(VERSION 3.0)

project(Mylibrary)

aux_source_directory(${PROJECT_SOURCE_DIR}/src MY_SRC) # 在对应的文件下搜索所有的源文件

include_directories(include) # 包括头文件

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) # 库生成在根目录下的lib目录下

add_library(calc SHARED ${MY_SRC}) # 生成动态库

# add_library(calc STATIC ${MY_SRC}) # 库名称为calc,源文件从MY_SRC中提取

在这里插入图片描述在这里插入图片描述

连接动静态库

首先我们创建一个新的文件夹,然后进去:
在这里插入图片描述使用对应的库的时候要首先把它对应的头文件包括进来,所以我们把对应的头文件拷贝到这个新的文件夹下:
在这里插入图片描述在这里插入图片描述
然后把对应的库拿过来:
在这里插入图片描述在这里插入图片描述
然后我们创建自己的src文件,build文件来管理:
在这里插入图片描述
还有CMakeLists.txt:

在这里插入图片描述

在这里插入图片描述
首先我们要在CMakeLists.txt中包括我们的头文件,因为这是我们自己写的第三方库,所以我们要显示的写:

project(MyTest)

include_directories(${PROJECT_SOURCE_DIR}/include) # 包括头文件

link_libraries连接静态库

我们可以用link_libraries连接静态库,这里静态库的名字可以是全名 libxxx.a
也可以是掐头(lib)去尾(.a)之后的名字 xxx

link_libraries(<static lib> [<static lib>...])
project(MyTest)

include_directories(${PROJECT_SOURCE_DIR}/include) # 包括文件

# 连接静态库
link_libraries(calc)

但是这个是我们自己写的第三方库,可能出现找不到的情况,所以我们要告诉cmake到哪里去找:

link_directories到哪个路径去找库

我这里的库是放在lib下的,所以可以这样写:

project(MyTest)

include_directories(${PROJECT_SOURCE_DIR}/include) # 包括文件

# 源文件
aux_source_directory(${PROJECT_SOURCE_DIR}/src MY_SRC)

# 到这个路径下找库
link_directories(${PROJECT_SOURCE_DIR}/lib)

# 连接静态库
link_libraries(calc)

# 生成可执行文件
add_executable(mytest ${MY_SRC})

然后在main函数里编写:

#include"my_add.h"

int main()
{
    std::cout << add(2,3) << std::endl;

    return 0;
}

在这里插入图片描述
我们可以测试一下:
在这里插入图片描述

target_link_libraries连接动态库

动态库的链接和静态库是完全不同的:

target_link_libraries(
    <target> 
    <PRIVATE|PUBLIC|INTERFACE> <item>... 
    [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)

静态库会在生成可执行程序的链接阶段被打包到可执行程序中,所以可执行程序启动,静态库就被加载到内存中了。
动态库在生成可执行程序的链接阶段不会被打包到可执行程序中,当可执行程序被启动并且调用了动态库中的函数的时候,动态库才会被加载到内存

因此,在cmake中指定要链接的动态库的时候,应该将命令写到生成了可执行文件之后,同时,这是我们自己写的第三方库,所以也要告诉cmake到哪里去找库:

project(MyTest)

include_directories(${PROJECT_SOURCE_DIR}/include) # 包括文件

# 源文件
aux_source_directory(${PROJECT_SOURCE_DIR}/src MY_SRC)

# 到这个路径下找库
link_directories(${PROJECT_SOURCE_DIR}/lib)

# 连接静态库
#link_libraries(calc)

# 生成可执行文件
add_executable(mytest ${MY_SRC})

# 链接动态库
target_link_libraries(mytest calc) # 将calc链接到mytest中

在这里插入图片描述

find_library

寻找库文件,不仅可以用link_directories还可用find_library:

find_library() 是 CMake 中的一个内置命令,用于在系统中查找指定库文件的路径。这个命令主要用于那些不提供标准 CMake 配置文件(如 calcConfig.cmake 或 calc-config.cmake)的库,或者在需要更精细控制库查找过程的场景中。以下是 find_library() 命令的基本用法、参数和示例:

find_library(<variable>
             NAMES <name1> [<name2> ...]
             HINTS <hint1> [<hint2> ...]
             PATHS <path1> [<path2> ...]
						...])
  • <variable>: 存储找到的库文件路径的变量名。如果找到库,该变量将被设置为库文件的全路径;否则,变量将保留未定义状态或被设置为空字符串。
  • NAMES: 指定要查找的库文件名。通常包括库的基础名称(如 calc)和可能的后缀(如 .a.so.dll 等)。可以指定多个备选名称。
  • HINTSPATHS: 提供查找库文件的额外路径提示或直接路径。HINTS 的优先级高于 PATHS。这些路径将被添加到 CMake 的默认查找路径中。
project(MyTest)

include_directories(${PROJECT_SOURCE_DIR}/include) # 包括文件

# 源文件
aux_source_directory(${PROJECT_SOURCE_DIR}/src MY_SRC)

# 到这个路径下找库
# link_directories(${PROJECT_SOURCE_DIR}/lib)
find_library(CALC_LIBRARY NAMES calc PATHS "${PROJECT_SOURCE_DIR}/lib")

# 连接静态库
#link_libraries(calc)

# 生成可执行文件
add_executable(mytest ${MY_SRC})

# 链接动态库
target_link_libraries(mytest ${CALC_LIBRARY})

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UnityShader学习计划

1.安装ShaderlabVS,vs的语法提示 2. 常规颜色是fixed 3.FrameDebugger调试查看draw的某一帧的全部信息&#xff0c;能看到变量参数的值

雅马哈电钢琴YDP145

数据线&#xff1a;MIDI 琴可以通过MIDI、线直接连接手机&#xff0c;播放声音 琴通过线连接电脑&#xff0c;不能直接播放声音 https://www.bilibili.com/video/BV1ws4y1M7yw 操作&#xff1a; https://usa.yamaha.com/support/updates/yamaha_steinberg_usb_driver_for_win…

王道汽车4S企业管理系统 SQL注入漏洞复现

0x01 产品简介 王道汽车4S企业管理系统(以下简称“王道4S系统”)是一套专门为汽车销售和维修服务企业开发的管理软件。该系统是博士德软件公司集10余年汽车行业管理软件研发经验之大成,精心打造的最新一代汽车4S企业管理解决方案。 0x02 漏洞概述 王道汽车4S企业管理系统…

完美照片由构图决定,摄影构图基础到进阶

一、资料描述 本套摄影构图资料&#xff0c;大小1.04G&#xff0c;共有51个文件。 二、资料目录 新手必备-摄影构图技巧.doc 无忌版的《摄影构图学》.pdf 完美照片的十大经典拍摄技法.pdf 数码摄影曝光手边书.pdf 数码摄影不求人.30天学会数码摄影构图.pdf 数码单反摄影…

sheng的学习笔记-AI-决策树(Decision Tree)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 目录 什么是决策树 划分选择 信息增益 增益率 基尼指数 剪枝处理 预剪枝 后剪枝 连续值处理 另一个例子 基本步骤 排序 计算候选划分点集合 评估分割点 每个分割点都进行评估&#xff0c;找到最大信息增益的…

靠谱的大型相亲交友婚恋平台有哪些?相亲app软件前十名

靠谱交友软件&#xff0c;个人感觉还是要选择大型的&#xff0c;口碑好的进行选择&#xff0c;以下是我用过的婚恋平台&#xff0c;分享给大家 1、丛丛 这是我用的最久的一款脱单小程序&#xff0c;我老公就是在这个小程序找到的&#xff01;&#xff01;&#xff01; 这是一款…

CSS边框

目录 内容区&#xff08;content&#xff09;&#xff1a; 边框&#xff08;border&#xff09;&#xff1a; 前言&#xff1a; 示例&#xff1a; 内容区&#xff08;content&#xff09;&#xff1a; 内容区就是盒子里面用来存放东西的区域&#xff0c;里面你可以随便放如:…

计算机三级数据库技术备考笔记(十三)

第十三章 大规模数据库架构 分布式数据库 分布式数据库系统概述 分布式数据库系统是物理上分散、逻辑上集中的数据库系统。系统中的数据分布在物理位置不同的计算机上&#xff08;通常称为场地、站点或结点&#xff0c;本章均用场地来描述&#xff09;&#xff0c;由通信网络将…

大语言模型总结整理(不定期更新)

《【快捷部署】016_Ollama&#xff08;CPU only版&#xff09;》 介绍了如何一键快捷部署Ollama&#xff0c;今天就来看一下受欢迎的模型。 模型简介gemmaGemma是由谷歌及其DeepMind团队开发的一个新的开放模型。参数&#xff1a;2B&#xff08;1.6GB&#xff09;、7B&#xff…

VMware安装Red Hat7.9

1、下载Red Hat Enterprise Linux7.9版本 【百度网盘下载】 链接&#xff1a;https://pan.baidu.com/s/1567NfZRF48PBXfUqxumvDA 提取码&#xff1a;bm7u 2、在虚拟机中创建Red Hat7.9 【点击创建虚拟机】 【自定义高级】 【选择光盘映像安装】 全名自定义即可 【虚拟机命…

Dual-AMN论文翻译

Boosting the Speed of Entity Alignment 10: Dual Attention Matching Network with Normalized Hard Sample Mining 将实体对齐速度提高 10 倍&#xff1a;具有归一化硬样本挖掘的双重注意力匹配网络 ABSTRACT 寻找多源知识图谱(KG)中的等效实体是知识图谱集成的关键步骤&…

分享 WebStorm 2024 激活的方案,支持JetBrains全家桶

大家好&#xff0c;欢迎来到金榜探云手&#xff01; WebStorm公司简介 JetBrains 是一家专注于开发工具的软件公司&#xff0c;总部位于捷克。他们以提供强大的集成开发环境&#xff08;IDE&#xff09;而闻名&#xff0c;如 IntelliJ IDEA、PyCharm、和 WebStorm等。这些工具…

Zynq学习笔记--AXI 总线概述

目录 1. AXI总线概述 1.1 主要特点 1.2 通道功能 1.3 信号概览 2. AXI Interconnect 2.1 信号说明 2.2 内部结构 3. PS-PL AXI Interface 3.1 AXI FPD/LFP/ACP 3.2 Address Editor 3.3 地址空间 3.4 AXI-DDR 4. 通过ILA观察AXI信号 4.1 AXI 读通道 1. AXI总线概述…

故障诊断 | Matlab实现基于小波包结合鹈鹕算法优化卷积神经网络DWT-POA-CNN实现电缆故障诊断算法

故障诊断 | Matlab实现基于小波包结合鹈鹕算法优化卷积神经网络DWT-POA-CNN实现电缆故障诊断算法 目录 故障诊断 | Matlab实现基于小波包结合鹈鹕算法优化卷积神经网络DWT-POA-CNN实现电缆故障诊断算法分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现基于小波…

复杂DP算法(动态规划)

复杂DP算法 一、线性DP例题1、鸣人的影分身题目信息思路题解 2、糖果题目信息思路题解 二、区间DP例题密码脱落题目信息思路题解 三、树状DP例题生命之树题目信息思路题解 一、线性DP 例题 1、鸣人的影分身 题目信息 思路 题解 #include <bits/stdc.h> #define endl …

funasr 麦克风实时流语音识别

参考: https://github.com/alibaba-damo-academy/FunASR chunk_size 是用于流式传输延迟的配置。[0,10,5] 表示实时显示的粒度为 1060=600 毫秒,并且预测的向前信息为 560=300 毫秒。每个推理输入为 600 毫秒(采样点为 16000*0.6=960),输出为相应的文本。对于最后一个语音…

Thinkphp6接入PayPal支付

沙盒环境示例 创建扩展封装类 <?php namespace lib;class PayPalApi {//clientIdprivate $clientId;//clientSecretprivate $clientSecret;//服务器地址private $host https://api-m.sandbox.paypal.com/;//主机头private $headers [];//api凭证private $token ;//报文…

YOLO系列简记

本文主要参考了论文 A Comprehensive Review of YOLO Architectures in Computer Vision: From YOLOv1 to YOLOv8 and YOLO-NAS&#xff0c;以及其中提到的各 YOLO 原论文。 NMS 对所有检测框&#xff0c;按置信度降序排序。选择最高置信度的检测框&#xff0c;添加到最终结果…

java学习之路-继承

文章目录 前言 目录 1.1继承的概念 1.2继承有什么好处&#xff0c;为何要继承 1.3继承的语句 1.4父类成员的访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super关键字 2.子类构造方法 2.1如何创建构造方法 2.2创建构造方法 3.super和this 【相同点…

C++(2) —— 通讯录管理系统

目录 1、系统需求 2、创建项目 3、菜单功能 4、退出功能 5、添加联系人 6、显示联系人 7、删除联系人 8、查找联系人 9、修改联系人 10、清空联系人 1、系统需求 2、创建项目 3、菜单功能 // 1、菜单界面 void showMenu() {cout << "--------------------…