从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.mzph.cn/news/891317.shtml

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

相关文章

VisualStudio 2019 升级遇到的问题及解决

事件起因 今天计划想研究下.net core&#xff08;后面版本直接称为 .net &#xff09;,发现 .net sdk 5.0 最新版本安装不成功。解决之后&#xff0c;真是手欠&#xff0c;看着Visual Studio 2019 有更新了&#xff0c;就直接点击了&#xff0c;这时才发现问题大了。。。 安装…

Spring Boot教程之四十一:在 Spring Boot 中调用或使用外部 API

如何在 Spring Boot 中调用或使用外部 API&#xff1f; Spring Boot 建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。它现在越来越受到开发人员的青睐&#xff0c;因为它是一个快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置…

HTML5实现好看的新年春节元旦网站源码

HTML5实现好看的新年春节元旦网站源码 前言一、设计来源1.1 主界面1.2 新年由来界面1.3 文章详细界面1.4 登录界面1.5 注册界面1.6 新年图册界面1.7 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的新年春节元旦网站源码&#xff0c;春节新…

Python学习(5):数据结构

1 列表 1.1 列表方法 列表数据类型支持很多方法&#xff0c;列表对象的所有方法所示如下&#xff1a; list.append(x)&#xff1a;在列表末尾添加一项。 类似于 a[len(a):] [x]。list.extend(iterable)&#xff1a;通过添加来自 iterable 的所有项来扩展列表。 类似于 a[len…

2021.12.28基于UDP同信的相关流程

作业 1、将TCP的CS模型再敲一遍 服务器 #include <myhead.h> #define PORT 8888 #define IP "192.168.124.123" int main(int argc, const char *argv[]) {//创建套接字//绑定本机IP和端口号//监听客户端请求//接收客户端连接请求//收发消息//创建套接字int…

2024年RAG:回顾与展望

2024年&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术经历了从狂热到理性的蜕变&#xff0c;成为大模型应用领域不可忽视的关键力量。年初&#xff0c;AI的“无所不能”让市场充满乐观情绪&#xff0c;RAG被视为解决复杂问题的万能钥匙&#xff1…

Python 爬虫

一、创建项目 1.双击打开pycharm&#xff0c;点击新建项目 2.项目设置- 勾选[继承全局站点软件包]- 勾选[可用于所有项目]- 取消勾选[创建main.py欢迎脚本]- 点击创建 3.项目名称右键--新建--python文件 4.输入文件名--回车二、编辑代码 # 导入请求模块 import requests # 如…

idea项目导入gitee 码云

1、安装gitee插件 IDEA 码云插件已由 gitosc 更名为 gitee。 1 在码云平台帮助文档http://git.mydoc.io/?t153739上介绍的很清楚&#xff0c;推荐前两种方法&#xff0c; 搜索码云插件的时候记得名字是gitee&#xff0c;gitosc已经搜不到了。 2、使用码云托管项目 如果之…

基于JAVA+SpringBoot+Vue的机动车号牌管理系统

基于JAVASpringBootVue的机动车号牌管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; …

活动预告 |【Part1】Microsoft Azure 在线技术公开课:基础知识

课程介绍 参加“Azure 在线技术公开课&#xff1a;基础知识”活动&#xff0c;培养有助于创造新的技术可能性的技能并探索基础云概念。参加我们举办的本次免费培训活动&#xff0c;扩充自身的云模型和云服务类型知识。你还可以查看以计算、网络和存储为核心的 Azure 服务。 活…

郑州时空-TMS运输管理系统 GetDataBase 信息泄露漏洞复现

0x01 产品简介 郑州时空-TMS运输管理系统是一款专为物流运输企业设计的综合性管理软件,旨在提高运输效率、降低运输成本,并实现供应链的协同运作。系统基于现代计算机技术和物流管理方法,结合了郑州时空公司的专业经验和技术优势,为物流运输企业提供了一套高效、智能的运输…

BUUCTF Pwn ciscn_2019_es_2 WP

1.下载 checksec 用IDA32打开 定位main函数 发现了个假的后门函数&#xff1a; 看看vul函数&#xff1a; 使用read读取 想到栈溢出 但是只有48个 只能覆盖EBP和返回地址 长度不够构造 所以使用栈迁移&#xff1a; 栈迁移需要用到leave ret 使用ROPgadget找地址&#xff1a; …

07-ArcGIS For JavaScript--隐藏参数qualitySettings(memory和lod控制)

目录 1、综述2、sceneview.qualitySettings2.1、sceneview.qualitySettings.memoryLimit2.2、lodFactor2.3 additionalCacheMemory 3、结论 1、综述 先上重点&#xff0c;SceneView.qualitySettings为隐藏对象参数&#xff0c;该对象的memoryLimit和lodFactor等值&#xff0c;…

【SQL Server】教材数据库(1)

1 利用sql建立教材数据库&#xff0c;并定义以下基本表&#xff1a; 学生&#xff08;学号&#xff0c;年龄&#xff0c;性别&#xff0c;系名&#xff09; 教材&#xff08;编号&#xff0c;书名&#xff0c;出版社编号&#xff0c;价格&#xff09; 订购&#xff08;学号…

RP2040 C SDK I2C外设使用

RP2040 C SDK I2C外设使用 &#x1f4cc;相关篇《RP2040 VSCode C/C开发环境快速部署》&#x1f4cd;I2C API 外设&#xff1a;https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_hardware_i2c&#x1f527;驱动I2C ssd1306 屏幕需要使用到的库&#xf…

模仿微信小程序wx.showModal自定义弹窗,内容可以修改

实现以下弹框样式功能 1.在components新建一个文件showModel.wpy作为组件&#xff0c;复制下面代码 <style lang"less" scoped> .bg_model {display: flex;justify-content: center;align-items: center;// 弹框背景.bg_hui {width: 100%;height: 100%;posi…

WebP Vs. PNG:哪种图像格式适合您的网站?

图像对任何网站都至关重要,可以增强视觉吸引力和用户体验。但是,图像也会显着影响网站的加载时间,因此必须针对 Web 使用对其进行优化。一种方法是使用正确的图像格式。

mysql乱码、mysql数据中文问号

网上排出此错误方法的很多&#xff0c;但是 都不简洁&#xff0c;找不到根本原因 主要排查两点&#xff1a; 1.代码中jdbc链接的编码规则 urljdbc:mysql://localhost:3306/title?useUnicodetrue&amp;characterEncodingutf8 将characterEncoding设置为utf8 2.设置mysq…

INT303 Big Data Analytics 笔记

Lecture1 Introduction 不考&#xff01; “Data Mining is the study of collecting, processing, analyzing, and gaining useful insights from data” EXPLORATORY ANALYSIS Make measurements to understand what the data looks like first steps when collecting da…

Unity3D仿星露谷物语开发12之创建道具列表

1、目标 道具是游戏的核心部分&#xff0c;道具包括你可以拾取的东西&#xff0c;你可以使用的工具和你能种的东西等。 本节就是创建道具的信息类。同时了解ScriptableObject类的使用。 2、创建道具枚举类 修改Assets -> Scripts -> Enums.cs脚本&#xff0c; 新增如…