【CMake系列】05-静态库与动态库编译

news2024/10/5 21:59:36

在各种项目类型中,可能我们的项目就是一个 库 项目,向其他人提供 我们开发好的 库 (windows下的 dll /lib ; linux下的 .a / .so);有时候在一个项目中,我们对部分功能 打包成 库,方便在不同地方进行调用

静态库 和 动态库 对项目 实现了 不同程度的解耦,

  • 静态库,往往会 链接时 加载,代码会复制一起打包到 可执行程序中
  • 动态库 更多是 运行时 加载,加载到内存,供可执行程序调用

学会使用 cmake 构建 静态库 和 动态库,是我们这篇文章的主要内容

本专栏的实践代码全部放在 github 上,欢迎 star !!!

如有问题,欢迎留言、或加群【392784757】交流

涉及命令

add_library(<name> [<type>] [EXCLUDE_FROM_ALL] <sources>...)

其中 type 用来指定构建库的类型【本篇 只针对 shared static 展开】
type

  • shared
  • static

使用库

# 路径配置相关 有时候需要
include_directories()
link_directories()

target_link_libraries() # 关键代码 

代码部分

log/
|—|—|log.cpp
|—|—|log.h
|—|—|CMakeLists.txt
test_log/
|—|—|test_log.cpp
|—|—|CMakeLists.txt
CMakeLists.txt

log.h

// log.h
#ifndef LOG_H
#define LOG_H


class Log
{
public:
  Log();
};
#endif

log.cpp

#include "log.h"
#include <iostream>
using namespace std;

Log::Log()
{
  cout << "create Log" << endl;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.20)

project(log)

add_library(log STATIC log.cpp log.h)

test_log 下

test_log.cpp

#include <iostream>
#include "log.h"
using namespace std;

int main()
{
  Log log;
  cout << "test log" << endl;
  return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.20)

project(test_log)

include_directories("../log") # 头文件路径

# 指定库查找路径 windows 自动找 ../log/build/Debug ../log/build/Release
link_directories("../log/build")

add_executable(test_log test_log.cpp)

#指定加载的库
target_link_libraries(test_log log)

构建静态库

type 指定的是 static

cd log
cmake -B build -S .
cmake --build build

cd test_log
cmake -B build -S .
cmake --build build

具体的还可以指定 lib的输出路径

动态库构建

我们 在 log 同级目录下 创建 CMakeLists.txt 内容如下

cmake_minimum_required(VERSION 3.20)

project(log)

include_directories(log)

# 添加log库编译 项目自带预处理变量 log_EXPORTS
add_library(log SHARED log/log.cpp)

add_executable(test_log test_log/test_log.cpp log)


target_link_libraries(test_log log)

windows下构建动态库存在问题

如果我们把 STATIC 改为 SHARED ,然后构建,发现会报错

LINK : fatal error LNK1104: 无法打开文件“Debug\log.lib”

其实 也就是 找不到.lib 文件

log.h 修改

// log.h
#ifndef LOG_H
#define LOG_H

// __declspec(dllexport) 导出 log 到lib文件中

#ifndef _WIN32
#define CPP_API
#else
// 针对 windows 平台
// log 库文件调用 dllexport
// test_log 调用 dllimport
// 通过预定义宏 确定是谁在调用
#ifdef log_EXPORTS
#define CPP_API __declspec(dllexport) // 库项目调用
#else
#define CPP_API __declspec(dllimport) // 调用库项目 调用
#endif
#endif

class CPP_API Log
{
public:
  Log();
};
#endif

需要将 dll 中定义的 函数、类符号 等导出到lib 才能找到 【也就是 符号导出】

  • dll 二进制代码
  • lib 函数 符号 地址 【理解程度有限】

做法就是在 函数、类等 前面 添加 _declspec(dllexport),

关于 dllexport dllimport 的更详细解释,推荐这个
https://zhuanlan.zhihu.com/p/680966160

然后进行构建,成功!
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

[Linux] 软链接使用绝对路径的重要性

文章目录 软链接使用绝对路径的重要性软链接路径复制软链接查看文件类型 软链接使用绝对路径的重要性 软链接路径 软链接必须指定绝对路径&#xff0c;否则复制软链接后&#xff0c;由于软链接的相对路径是从软链接所处位置开始解析的&#xff0c;因此使用相对路径的软链接可…

pip(3) install,完美解决 externally-managed-environment

前言 现象 在 Manjaro 22、Ubuntu 23.04、Fedora 38 等最新的linux发行版中运行pip install时&#xff0c;通常会收到一个错误提示&#xff1a;error: externally-managed-environment&#xff0c;即“外部管理环境”错误&#xff0c;但这不是一个 bug。 如果您想阅读&#x…

ISSCC论文详解-ISSCC.34.1 适用于高精度 AI 应用的 28nm 83.23TFLOPS/W POSIT

0 前言 本文将对存内计算前沿论文——ISSCC 2024 34.1进行分享介绍&#xff0c;包括背景介绍、解决方案和架构、主要创新点、最终结果对比四部分内容。 1 背景介绍 题目&#xff1a;《A 28nm 83.23TFLOPS/W POSIT-Based Compute-in-Memory Macro for High-Accuracy AI Appli…

【UML用户指南】-08-对基本结构建模-图

目录 1、41视图 2、术语和概念 3、结构图 &#xff08;1&#xff09;类图&#xff08;class diagram&#xff09;&#xff1a; &#xff08;2&#xff09;构件图&#xff1a;&#xff08;component diagram&#xff09; &#xff08;3&#xff09;组合结构图&#xff1a;…

掌握ChatGPT的正确打开方式

引言 随着人工智能技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域取得了显著的突破。其中&#xff0c;聊天生成预训练变换器&#xff08;ChatGPT&#xff09;作为一种新型的对话式AI模型&#xff0c;引起了广泛关注。本文将详细介绍ChatGPT的正确使用…

更换 RT-DETR 主干网络为 【ResNet-18】【ResNet-34】| 已支持 18/34/50/101/152 全系列尺寸

本专栏内容均为博主独家全网首发,未经授权,任何形式的复制、转载、洗稿或传播行为均属违法侵权行为,一经发现将采取法律手段维护合法权益。我们对所有未经授权传播行为保留追究责任的权利。请尊重原创,支持创作者的努力,共同维护网络知识产权。 之前这篇文章写过了添加【R…

ChatGPT基本原理详细解说

ChatGPT基本原理详细解说 引言 在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是研究的热点之一。随着技术的发展&#xff0c;我们见证了从简单的聊天机器人到复杂的语言模型的演变。其中&#xff0c;ChatGPT作为一项突破性技术&#xff0c;以其强大…

实战:Zig 编写高性能 Web 服务(2)

1.1 编写 HTTP server 我们从python -m http.server 8000启动得到灵感&#xff0c;先确定好目标&#xff1a; 编写一个HTTP/1.1 http serverzig version 0.12.0 使用zig init搭建项目的前置工作你先自行搭建好&#xff0c;不会的翻看前面铺垫的章节熟悉zig的项目结构。 关键…

小米用田忌赛马的方式,逼得苹果降价超2000元应对,确实厉害

苹果的iPhone15降价2300多元&#xff0c;成为618的大热门&#xff0c;之前不少人士认为迫使苹果如此大幅度降价的原因是因为另一家手机企业的竞争&#xff0c;而日前有人士认为是小米用田忌赛马的方式&#xff0c;迫使苹果降价应对。 小米这次大幅度降价的手机并非是最新款的小…

设计模式-策略模式(行为型)

行为型-策略模式 了解策略模式 策略模式是一种行为型设计模式&#xff0c;在策略模式中定义了一系列算法或者策略&#xff0c;并将这些策略封装到独立的类中&#xff0c;使得可以相互替换。在使用时&#xff0c;可以指定响应的策略使用。 角色 策略接口&#xff1a;对于某种…

【计算机网络】计算机网络的概念

计算机网络的概念 导读一、计算机网络的概念1.1 个人理解1.2 通信设备与线路1.2.1 集线器1.2.2 交换机1.2.3 路由器 1.3 计算机网络的进一步理解1.4 互联网1.5 网的不同含义 二、计算机网络的不同定义2.1 广义观点2.2 资源共享观点2.3 用户透明性观点 结语 导读 大家好&#x…

【机器学习】基于OpenCV和TensorFlow的MobileNetV2模型的物种识别与个体相似度分析

在计算机视觉领域&#xff0c;物种识别和图像相似度比较是两个重要的研究方向。本文通过结合深度学习和图像处理技术&#xff0c;基于OpenCV和TensorFlow的MobileNetV2的预训练模型模&#xff0c;实现物种识别和个体相似度分析。本文详细介绍该实验过程并提供相关代码。 一、名…

【Python】ERROR: Could not find a version that satisfies the requirement

成功解决“ERROR: Could not find a version that satisfies the requirement”错误的全面指南 一、引言 在Python开发中&#xff0c;经常需要通过pip工具来安装各种依赖包。然而&#xff0c;有时在尝试安装某个包时&#xff0c;可能会遇到“ERROR: Could not find a version …

批量提取 Word 文档中的全部图片

步骤 1、打开 WinRAR 任选一个现成的压缩包双击打开 WinRAR &#xff0c;或从开始菜单打开 WinRAR 2、直接把要提取图片的 Word 文档拖入 WinRAR 菜单区域 1 → 2 → 3&#xff0c;WinRAR 资源管理目录中的 media 就是该 Word 文档所要提取的全部图片所在文件夹 按住&#x…

python书上的动物是啥

Python的创始人为Guido van Rossum。1989年圣诞节期间&#xff0c;在阿姆斯特丹&#xff0c;Guido为了打发圣诞节的无趣&#xff0c;决心开发一个新的脚本解释程序&#xff0c;做为ABC语言的一种继承。之所以选中Python作为程序的名字&#xff0c;是因为他是一个叫Monty Python…

CATIA进阶操作——创成式曲面设计入门(1)线架设计,三维点、直线、平面、曲线

目录 引出三维空间点生成三维直线三维平面三维曲线总结异形弹簧新建几何体草图编辑&#xff0c;画一条样条线进行扫掠&#xff0c;圆心和半径画出曲面上的螺旋线再次选择扫掠&#xff0c;圆心和半径 其他自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重…

c++简略实现共享智能指针Shared_Ptr<T>

重点&#xff1a; 1.引用计数在堆上&#xff08;原本应为原子变量&#xff09; 2.引用计数增加减少需要加锁保证线程安全。 3.内部实现Release函数用于释放资源 4.未实现&#xff0c;增加自定义删除器可以将Release修改为模板函数&#xff0c;传入可调用参数。对于shared_p…

【Multi-Feature FAS】《Face Anti-Spoofing Based on Multi-Feature Fusion》

文章目录 原文贡献 / 相关工作作者的方法评价 原文 [1]杨敏.基于多特征融合的人脸防伪技术研究[D].武汉大学,2019. 贡献 / 相关工作 针对攻击对象存在背景依赖和非刚性运动造成的深度信息缺失问题&#xff0c;采用边缘信息放大差异 各种 loss 数据库 评价指标 本节将会对…

队列及其应用

实验内容 请设计一个简单的模拟银行排队系统&#xff0c;要求程序具有以下4项菜单&#xff1a; 1.取号。选择该菜单后&#xff0c;为客户产生一个排队号。 2.叫号。选择该菜单后&#xff0c;显示可服务的客户排队号。 3.查看队伍。从队首到队尾列出所有排队客户的排队号。 4.退…

94、python-第三阶段-4-数据计算-map方法

直接运行会报错&#xff0c;需要配置下python环境变量 from pyspark import SparkConf,SparkContext import os os.environ[PYSPARK_PYTHON]"D:/Program Files/Python/Python3.13/python.exe" conf SparkConf().setMaster("local[*]").setAppName("…