从0到机器视觉工程师(二):封装调用静态库和动态库

目录

静态库

编写静态库

使用静态库

方案一

方案二

动态库

编写动态库

使用动态库

方案一

方案二

方案三

总结


静态库

静态库是在编译时将库的代码合并到最终可执行程序中的库。静态库的优势是在编译时将所有代码包含在程序中,可以使程序独立运行,但增加了可执行文件的大小。

静态库需要.lib文件和一个.h文件,程序正常使用.h的函数,在链接选项里加入.lib文件或者#pragma comment手动加载

编写静态库

创建空项目,添加文件,右击项目属性修改生成目标为lib库

//print.h

#pragma once
#include <iostream>

void print();

//print.cpp

#include "print.h"

void print()
{
    std::cout << "静态库测试" << std::endl;
}

使用静态库

lib需要.h文件和.lib文件,如果没有把这两个文件复制到对应项目文件夹中的话就需要配置包含目录和库目录。

方案一

通过配置项目属性的方式进行添加到指定项目中去使用。

  • 包含目录 .h文件目录

  • 库目录 .lib文件目录

  • 链接输入增加lib

#include <iostream>
#include "print.h"  //切记需要包含头文件

int main()
{
    print();

    return 0;
}

方案二

通过#pragma直接导入lib文件的方式,但使用这种方式如果lib文件较多的话就会显得代码冗长。

#include <iostream>
#include "print.h"  //切记需要包含头文件
#pragma comment(lib,"./print_func.lib")
int main()
{
    print();

    return 0;
}

动态库

动态库是在运行时加载到内存中的库。它们可以被多个程序共享,减少了每个程序的内存占用和代码重复。动态库的优势是可在运行时更新库,但需要确保正确的库版本和依赖关系。

编写动态库

创建空项目,添加文件,右击项目属性修改生成目标为dll库,操作方式和lib库方式相同。但编写dll函数需要_declspec(dllexport)特殊声明。

在 Windows 系统上,当你将一个函数或符号定义为 __declspec(dllexport) 时,这意味着该函数或符号将被标记为可从动态链接库(DLL)中导出。这使得其他程序或模块能够通过使用 __declspec(dllimport) 来引用该函数或符号。需要注意的是,__declspec(dllexport) 是特定于 Microsoft Visual C++ 编译器的语法扩展。在其他平台和编译器上,通常使用不同的导出和导入方式。因此,如果你的代码需要在跨平台环境下移植或兼容其他编译器,建议查阅相关文档或使用更通用的跨平台导出方式,如使用预处理器宏或导出表等。

//Add.h

#pragma once
#include <iostream>

_declspec(dllexport) int add(int a, int b);

//Add.cpp

#include "Add.h"

int add(int a, int b)
{
    return a + b;
}

使用动态库

dll需要.h文件、.lib文件以及.dll文件,如果没有把这三个文件复制到对应项目文件夹中的话就需要配置包含目录和库目录。

方案一

将.h文件、.lib文件以及.dll文件置入工程所在目录,然后添加对应的.h头文件,类似配置第三方库的方式使用。

#include <iostream>
#include "Add.h"
#pragma comment(lib,"add_func.lib")

int main()
{
    std::cout << "sum:" << add(1, 2) << std::endl;
    return 0;
}

方案二

WIN32 API函数LoadLibrary、GetProcAddress装载,使用这种载入方法,不需要.lib文件和.h头文件,只需要.dll文件即可(将.dll文件置入工程目录中)

#include <iostream>
#include <windows.h>
typedef int(*DLLFunc)(int,int);
int main()
{
    DLLFunc func;
    HINSTANCE lib = LoadLibrary(L"add_func.dll");
    if (lib == nullptr)
    {
        FreeLibrary(lib);
        return 0;
    }
    func = (DLLFunc)GetProcAddress(lib, "add");
    if (func == nullptr)
    {
        FreeLibrary(nullptr);
        return 0;
    }
    std::cout<<func(1,2)<<std::endl;
    return 0;
}

方案三

配置包含目录和库目录,把dll文件放到.exe文件所在目录下,点击exe就可运行。

总结

本篇文章主要介绍了如何封装和调用动态库和静态库,静态库是在链接时使用的,动态库是在运行时使用的,dll相比于lib来说多了一个.dll文件,调用静态库和动态库最简单的方法就是把对应文件放到文件目录中,在调用时include头文件,使用#pragma comment(lib,.lib文件名),便可。若文件较多,为避免代码冗长,则可配置包含目录、库目录以及附加依赖项,从而可以直接使用。

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

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

相关文章

低代码开发:开启企业数智化转型“快捷键”

一、低代码开发浪潮来袭&#xff0c;企业转型正当时 在当今数字化飞速发展的时代&#xff0c;低代码开发已如汹涌浪潮&#xff0c;席卷全球。从国际市场来看&#xff0c;诸多企业巨头纷纷布局低代码领域&#xff0c;像微软的 PowerApps、OutSystems 等平台&#xff0c;凭借强大…

UE5动画蓝图

动画蓝图&#xff0c;混合空间&#xff0c;状态机&#xff0c;瞄准偏移&#xff0c;动画蒙太奇&#xff0c;动画混合&#xff0c;骨骼绑定&#xff0c;动画重定向&#xff0c;动画通知&#xff0c;Control Rig…… 虚幻动画模块是一个庞大的系统&#xff0c;大模块里又包含很多…

[redux] useDispatch的两种用法

先重写2个方法先, 方便ts类型推导,如果你看不懂为什么这么写, 先看我这篇 [redux] ts声明useSelector和useDispatch-CSDN博客 export type RootState ReturnType<typeof store.getState>; export type AppDispatch typeof store.dispatch; export const useAppDispat…

javaEE-网络原理-1初识

目录 一.网络发展史 1.独立模式 2.网络互联 二.局域网LAN 1.基于网线直连&#xff1a; 2.基于集线器组件&#xff1a; 3.基于交换机组件&#xff1a; 4.基于交换机和路由器组件 ​编辑 三、广域网WAN 四、网络通信基础 1.ip地址 2.端口号&#xff1a; 3.协议 4.五…

jenkins入门3

1、新建视图 视图可以理解为是item的集合&#xff0c;这样可以将item分类。新建视频可以选择加入已有的item 2、新建item 1)输入任务名称、选择一个类型&#xff0c;常用的是第一个freestyle project 2&#xff09;进行item相关配置&#xff0c;general 设置项目名字,描述,参数…

【C语言的小角落】--- 深度理解取余/取模运算

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; C语言的小角落 本篇博客我们来深度理解取余/取模&#xff0c;以及它们在不同语言中出现不同现象的原因。 &#x1f3e0; 关于取整 &#x1f3b5; 向0取整…

mapbox进阶,添加路径规划控件

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️MapboxDirections 控件二、🍀添加路径规划控件1. ☘️实现思路2. ☘️…

linux-25 文件管理(三)复制、移动文件,cp,mv

命令cp是copy的简写&#xff0c;而mv则是move的简写。那既然copy是用于实现复制文件的&#xff0c;那通常一般我们要指定其要复制的是谁&#xff1f;而且复制完以后保存在什么地方&#xff0c;对吧&#xff1f;那因此它的使用格式很简单&#xff0c;那就是cp srcfile dest&…

IDEA开发Java应用的初始化设置

一、插件安装 如下图所示&#xff1a; 1、Alibaba Java Coding Guidelines 2.1.1 阿里开发者规范&#xff0c;可以帮忙本地自动扫描出不符合开发者规范的代码&#xff0c;甚至是代码漏洞提示。 右击项目&#xff0c;选择《编码规约扫描》&#xff0c;可以进行本地代码规范扫…

GPU加速计算的专业云服务平台:蓝耘GPU算力平台的概述、具体应用与教学

文章目录 一、平台介绍蓝耘GPU算力平台概述平台优势与特点 二、注册与登录账号注册流程GPU服务器类型配置选择指南内存和存储容量网络带宽CPU配置 三、创建实例**实例创建步骤**镜像选择与设置 四、连接实例SSH连接方法远程桌面配置 一、平台介绍 蓝耘GPU算力平台概述 蓝耘GP…

golang:微服务架构下的日志追踪系统(二)

背景 在使用Gin框架进行服务开发时&#xff0c;我们遇到了一个日志记录的问题。由于Gin的上下文&#xff08;*gin.Context&#xff09;实现了context.Context接口&#xff0c;在调用日志记录器的Info、Warn、Error等方法时&#xff0c;直接传递Gin的上下文通常不会导致编译错误…

Vue项目整合与优化

前几篇文章&#xff0c;我们讲述了 Vue 项目构建的整体流程&#xff0c;从无到有的实现了单页和多页应用的功能配置&#xff0c;但在实现的过程中不乏一些可以整合的功能点及可行性的优化方案&#xff0c;就像大楼造完需要进行最后的项目验收改进一样&#xff0c;有待我们进一步…

网关的介绍

网关&#xff08;Gateway&#xff09;在网络技术中扮演着举足轻重的角色。为了让你更好地理解网关及其相关术语&#xff0c;我会尽量用简洁明了的语言来解释&#xff0c;同时也会穿插一些专业术语以便你深入学习。 网关的基本概念 网关&#xff0c;顾名思义&#xff0c;是网络的…

【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 一、循环控制 / 跳转语句的使用 1. 循环控制语句&#xff08;for 循环&#xff09; 2. 循环控制语句&#xff08;while 循环&#xff09; 3. 跳转语句&#xff08;break 语句&#xff09; 4. 跳转语句&#xff08;continue 语句&…

SD-WAN怎样减少异地组网的网络延迟?

在经济全球化的推动下&#xff0c;许多企业的业务已经扩展到多个国家或地区。这种情况下&#xff0c;企业需要搭建高效、稳定的网络连接&#xff0c;以确保异地的分支机构之间能够顺畅地交流。网络延迟是拉低异地组网数据传输效率的重要因素&#xff0c;直接影响到企业的运营和…

小程序学习06——uniapp组件常规引入和easycom引入语法

目录 一 组件注册 1.1 组件全局注册 1.2 组件全局引入 1.3 组件局部引入 页面引入组件方式 1.3.1 传统vue规范&#xff1a; 1.3.2 通过uni-app的easycom 二 组件的类型 2.1 基础组件列表 一 组件注册 1.1 组件全局注册 &#xff08;a&#xff09;新建compoents文件…

uniapp 微信小程序 自定义日历组件

效果图 功能&#xff1a;可以记录当天是否有某些任务或者某些记录 具体使用&#xff1a; 子组件代码 <template><view class"Accumulate"><view class"bx"><view class"bxx"><view class"plank"><…

上升沿下降沿递增

沿指令&#xff1a;P&#xff1a;上升沿 从01 导通一个扫描周期 N&#xff1a;下降沿 从10 导通一个扫描周期

大数据-268 实时数仓 - ODS层 将 Kafka 中的维度表写入 DIM

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; MyBatis 更新完毕目前开始更新 Spring&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; H…

微博_14.12.2-内置猪手 会员版

微博猪手是一款作用于微博的 XposedLsposed 模块&#xff0c;可以支持未root用户和已root用户使用。进入【我的】页面&#xff0c;点击【右上角的设置】&#xff0c;点击【微博猪手】即可进一步设置其他功能。通过微博猪手模块可以实现去除各种广告&#xff08;开屏、信息流等&…