从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文件名),便可。若文件较多,为避免代码冗长,则可配置包含目录、库目录以及附加依赖项,从而可以直接使用。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode Hot100 二分查找】搜索插入位置、搜索二维矩阵、搜索旋转排序数组、寻找两个正序数组的中位数

二分查找 搜索插入位置搜索二维矩阵在排序数组中查找元素的第一个和最后一个位置寻找旋转排序数组中的最小值搜索旋转排序数组寻找两个正序数组的中位数&#xff08;hard&#xff09; 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并…

你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗?

你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗&#xff1f; 一. JVM、JDK与JRE的关系二. JVM、JDK与JRE的作用2.1 什么是JVM&#xff1f;2.2 什么是JDK&#xff1f;2.3 什么是JRE&#xff1f; 前言 点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有…

在不到 5 分钟的时间内将威胁情报 PDF 添加为 AI 助手的自定义知识

作者&#xff1a;来自 Elastic jamesspi 安全运营团队通常会维护威胁情报报告的存储库&#xff0c;这些报告包含由报告提供商生成的大量知识。然而&#xff0c;挑战在于&#xff0c;这些报告的内容通常以 PDF 格式存在&#xff0c;使得在处理安全事件或调查时难以检索和引用相关…

数据挖掘——朴素贝叶斯分类

数据挖掘——朴素贝叶斯分类 朴素贝叶斯分类极大后验假设独立性假设贝叶斯分类器总结 朴素贝叶斯分类 什么是分类&#xff1f; 找出描述和区分数据类或概念的模型&#xff0c;以便能够使用模型预测未知的对象的类标号 概念区分 分类与回归 分类是预测分类&#xff08;离散、…

LabVIEW在反馈控制时如何解决带约束的控制问题

在LabVIEW中&#xff0c;解决带约束的反馈控制问题通常需要使用先进的控制算法或特定的方法来满足约束条件&#xff0c;同时保证控制系统的性能和稳定性。以下是解决这类问题的一些常用方法和步骤&#xff1a; ​ 1. 定义控制问题及约束条件 确定被控对象的动态特性&#xff08…

机器人对物体重定向操作的发展简述

物体重定向操作的发展简述 前言1、手内重定向和外部重定向2、重定向原语3、重定向状态转换网络4、连续任意姿态的重定向5、利用其他环境约束重定向总结Reference 前言 对于一些特殊的任务&#xff08;如装配和打包&#xff09;&#xff0c;对物体放置的位姿由明确的要求&#…

Mysql数据实时同步到Es上

同步方案 ① 同步双写 同步双写实一种数据同步策略&#xff0c;它指的是在主数据库(如mysql) 上进行数据修改操作&#xff0c;同时将这些修改同步写入到ES 中&#xff0c;这种策略旨在确保两个数据库之间的数据一致性&#xff0c;并且优化系统的读写性能。 目标 同步双写是…

力扣66 加一

class Solution:def plusOne(self, digits: List[int]) -> List[int]:# 从最低位开始加一for i in range(len(digits) - 1, -1, -1):if digits[i] < 9:digits[i] 1return digitsdigits[i] 0# 如果所有位都是9&#xff0c;需要增加一位&#xff0c;例如 999 -> 1000r…

代码段中使用数据、栈

代码段中使用数据 改进之后 代码段中使用栈 在数据段中专门空出一段&#xff0c;作为栈 将数据、代码、栈放入不同段中

OpenCV的TickMeter计时类

OpenCV的TickMeter计时类 1. TickMeter是一个计时的类1.1 计算耗时1.2 计算循环的平均耗时和FPS1.3 function 2. 案例 1. TickMeter是一个计时的类 https://docs.opencv.org/4.x/d9/d6f/classcv_1_1TickMeter.html#details 1.1 计算耗时 TickMeter tm;tm.start();// do some…

Fabric部署-docker安装

一&#xff1a;安装docker 1.先卸载旧docker apt-get remove docker docker-engine docker.io containerd runc PS&#xff1a;新开的虚拟机输入命令后是这样的。 2.更新软件包 在终端中执行以下命令来更新Ubuntu软件包列表和已安装软件的版本: sudo apt update sudo apt …

【CSS】 ---- CSS 实现图片背景清除的滑动效果三种方法

1. 实现效果 1.1 removebg 实现图片背景的去除 1.2 gitee 登录界面的项目协同效果 2. 实现分析 最常见的方法就是通过 JS 定位获取设置对应盒子的宽度&#xff1b;removebg 使用的方法是 clip-path: polygon 来设置图片的显示区域&#xff1b;gitee 使用的方法是 clip: rect …

开源模型迎来颠覆性突破:DeepSeek-V3与Qwen2.5如何重塑AI格局?

不用再纠结选择哪个AI模型了&#xff01;chatTools 一站式提供o1推理模型、GPT4o、Claude和Gemini等多种选择&#xff0c;快来体验吧&#xff01; 在全球人工智能模型快速发展的浪潮中&#xff0c;开源模型正逐渐成为一股不可忽视的力量。近日&#xff0c;DeepSeek-V3和Qwen 2.…

微信开发工具git提交到码云

超简单&#xff0c;适用新手快速实现新项目备份到码云。步骤如下&#xff1a; 1、先在码云创建一个仓库&#xff0c;不要初始化readme文件 2、点击微信开发工具版本管理&#xff0c;如果第一次&#xff0c;会提示初始化仓库&#xff0c;照做就行 3、配置一些git信息 输入你的码…

PHP7和PHP8的最佳实践

php 7 和 php 8 的最佳实践包括&#xff1a;使用类型提示以避免运行时错误&#xff1b;利用命名空间组织代码并避免命名冲突&#xff1b;采用命名参数、联合类型等新特性增强可读性&#xff1b;用错误处理优雅地处理异常&#xff1b;关注性能优化&#xff0c;如避免全局变量和选…

数据分享:空气质量数据--哈尔滨

说明&#xff1a;如需数据可以直接到文章最后关注获取。 1.数据背景 地理位置与气候条件&#xff1a;哈尔滨位于中国东北部&#xff0c;黑龙江省南部&#xff0c;松花江中游。由于其地理位置&#xff0c;冬季寒冷且漫长&#xff0c;夏季短促而温热。这种气候特点对空气质量…

端口镜像SPAN与RSPAN

端口镜像概述 端口镜像的作用主要在于一些难度较大的网络技术的学习中&#xff0c;我们通过抓包对报文的分析&#xff0c;可以更好地理解 还有的就是在网络排障的过程中&#xff0c;我们可以通过抓包分析数据报文的收发等状态&#xff0c;来判断在哪个设备节点上出现了问题 …

基于Web的足球青训俱乐部管理后台系统的设计与开发源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的基于Web的足球青训俱乐部管理后台系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基…

IDEA 撤销 merge 操作(详解)

作为一个开发者&#xff0c;我们都知道Git是一个非常重要的版本控制工具&#xff0c;尤其是在协作开发的过程中。然而&#xff0c;在使用Git的过程中难免会踩一些坑&#xff0c;今天我来给大家分享一个我曾经遇到的问题&#xff1a;在使用IDEA中进行merge操作后如何撤销错误的合…

用matlab调用realterm一次性发送16进制数

realterm采用PutString接口进行发送&#xff0c;需要注意的是发送的16进制数前面要加入0x标志。只有这样&#xff0c;realterm才能将输入的字符串识别为16进制数的形式。 另外,PutString函数支持两个参数输入&#xff0c;第一个参数为字符串&#xff0c;第二个参数为发送形式&…