当前位置: 首页 > news >正文

VS2022,DLL1调用lib,lib调用DLL2

DLL1调用lib,lib调用DLL2

问题1:为什么在dll1中需要引入dll2的.lib文件

当你有一个工程(dll1)调用静态库(lib),而静态库(lib)又调用另一个DLL(dll2)中的函数时,dll1需要引入dll2的.lib文件。这是因为静态库只是一个函数和数据的集合,它们的实现依赖于你链接到的其他库或DLL。在这种情况下:

  1. lib调用dll2中的函数:lib中的函数实现依赖于dll2提供的函数。
  2. dll1调用lib中的函数:dll1链接到lib,但lib中的函数实现依赖于dll2。

因此,dll1在链接时需要知道dll2中的符号。这就要求在dll1的链接器输入中包含dll2的.lib文件。

问题2:DLL工程为什么生成一个DLL文件,还生成了一个lib文件

当你构建一个DLL工程时,生成两个文件是正常的:一个DLL文件和一个.lib文件。它们的用途如下:

  1. DLL文件(动态链接库)

    • 这是实际的动态链接库文件,包含了你的程序可以在运行时加载并使用的实际代码和数据。
    • 它在运行时被加载到内存中,并通过导出的函数和数据与其他程序进行交互。
  2. LIB文件(导入库)

    • 这是一个导入库文件,包含了DLL导出的符号(函数和变量)的列表。
    • 在编译和链接过程中,链接器使用这个.lib文件来解析对DLL中符号的引用。它告诉链接器哪些符号在DLL中以及如何找到它们。
    • 导入库文件不包含实际的代码或数据,只包含符号的引用。

实际操作示例

假设有以下三个工程:

  1. DLL1(使用lib,间接调用DLL2)
  2. LIB(调用DLL2)
  3. DLL2(提供函数实现)
DLL2 工程

DLL2.h

#pragma once#ifdef BUILDING_DLL2
#define DLL2_PUBLIC __declspec(dllexport)
#else
#define DLL2_PUBLIC __declspec(dllimport)
#endifextern "C" DLL2_PUBLIC int dll2Function();

DLL2.cpp

#include "DLL2.h"int dll2Function() {return 42;
}

编译DLL2,生成 DLL2.dllDLL2.lib

DLL2工程配置预处理器定义:加入

DLL2_PUBLIC 

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

LIB 工程

Lib.h

#pragma onceint libFunction();

Lib.cpp

#include "Lib.h"
#include "DLL2.h"int libFunction() {return dll2Function() + 100;
}

编译LIB工程,生成 Lib.lib

DLL1 工程

DLL1.h

#pragma once#ifdef BUILDING_DLL1
#define DLL1_PUBLIC __declspec(dllexport)
#else
#define DLL1_PUBLIC __declspec(dllimport)
#endifextern "C" DLL1_PUBLIC int dll1Function();

DLL1.cpp

#include "DLL1.h"
#include "Lib.h"int dll1Function() {return libFunction() + 10;
}

在DLL1工程中配置:

  1. 包含路径

    • 项目属性 -> VC++目录 -> 包含目录中,添加 ../Lib../DLL2
  2. 库目录

    • 项目属性 -> VC++目录 -> 库目录中,添加 ../Lib/build../DLL2/build
  3. 附加依赖项

    • 项目属性 -> 链接器 -> 输入 -> 附加依赖项中,添加 Lib.libDLL2.lib

通过这些配置,dll1工程在链接时可以解析lib中的符号,而lib中的符号依赖于dll2中的符号,这些符号通过dll2的.lib文件提供。

总结

  • 引入顺序:当一个DLL调用一个静态库,而静态库又依赖另一个DLL时,调用链中的所有DLL的.lib文件都需要在**最外层工程中引入。**
  • 生成两个文件的原因:DLL工程生成的DLL文件用于运行时,而lib文件用于链接时解析符号引用。

相关文章:

VS2022,DLL1调用lib,lib调用DLL2

DLL1调用lib,lib调用DLL2 问题1:为什么在dll1中需要引入dll2的.lib文件 当你有一个工程(dll1)调用静态库(lib),而静态库(lib)又调用另一个DLL(dll2&#xf…...

Unity Mirror VR联机开发 房间篇

一、需求 在联机时通常有加入房间这个步骤,在mirror示例中也有相应的案例,但是那个比较复杂,我们做教育科普类不需要如此复杂,傻瓜式操作基本就可以了,所以我简化了步骤,省略了点击准备按钮这一步骤&#…...

二叉树—leetcode

前言 本篇博客我们来仔细说一下二叉树二叉树的一些OJ题目 请看完上一篇:数据结构-二叉树-CSDN博客 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:LeetCode_普通young man的博客-CSDN博客 若有问题 评论区见📝 &…...

shell编程(二)——字符串与数组

本文为shell 编程的第二篇,介绍shell中的字符串和数组相关内容。 一、字符串 shell 字符串可以用单引号 ‘’,也可以用双引号 “”,也可以不用引号。 单引号的特点 单引号里不识别变量单引号里不能出现单独的单引号(使用转义符…...

【数据结构】二叉树专题

前言 本篇博客我们来看一些二叉树的经典题型,也是对上篇博客的补充 💓 个人主页:小张同学zkf ⏩ 文章专栏:数据结构 若有问题 评论区见📝 🎉欢迎大家点赞👍收藏⭐文章 ​ 目录 1.单值二叉树 …...

开源模型应用落地-LangChain高阶-LCEL-表达式语言(四)

一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么? LCEL是一种非常灵活和强大的语言,可以帮助您更…...

Python第二语言(九、Python第一阶段实操)

目录 1. json数据格式 2. Python与json之间的数据转换 3. pyecharts模块官网 4. pyecharts快速入门(折线图) 5. pyecharts全局配置选项 5.1 set_global_ops使用 5.1.1. title_opts 5.1.2 legend_opts 5.1.3 toolbox_opts 5.1.4 visualmap_opts…...

Java异常机制

1.异常概述和异常处理机制 异常(exception)概述 异常就是程序在运行时出现的意外的,不正常的情况。 若异常产生后没有正确的处理,会导致程序的中断,程序不继续执行,以致造成损失。 2.2 异常处理机制 所以我们在开发中要一套机制来处理各种可能…...

Aws EC2,kubeadm方式安装kubernetes(k8s)

版本 docker版本:20.10.25 k8s版本(kubeadm,kubelet和kubectl):1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …...

python 比较 mysql 表结构差异

最近在做项目的时候,需要比对两个数据库的表结构差异,由于表数量比较多,人工比对的话需要大量时间,且不可复用,于是想到用 python 写一个脚本来达到诉求,下次有相同诉求的时候只需改 sql 文件名即可。 com…...

【RAG入门教程01】Langchian框架 v0.2介绍

LangChain 是一个开源框架,旨在简化使用大型语言模型 (LLM) 创建应用程序的过程。可以将其想象成一套使用高级语言工具进行搭建的乐高积木。 它对于想要构建复杂的基于语言的应用程序而又不必管理直接与语言模型交互的复杂性的开发人员特别有用。它简化了将这些模型…...

python 做成Excel并设置打印区域

记录首次用python处理Excel表格的过程。 参考文章:https://www.jianshu.com/p/5e00dc2c9f4c 程序要做的事情: 1. copy 模板文件到 output 文件夹并重命名为客户指定的文件名 2. 从 DB 查询数据并将数据写入 Excel 3. 写数据的同时, 设置每…...

SpringAI(二)

大模型:具有大规模参数和复杂计算结构的机器学习模型.通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数.其设计目的在于提高模型的表达能力和预测性能,应对复杂的任务和数据. SpringAI是一个AI工程领域的应用程序框架 大概推出时间是2023年7月份(不确定) 目的是将S…...

小白都可以通过U盘重装系统,再也不用花50块钱去安装系统啦

下载Ventoy 软件 1、今天带着大家通过Ventoy 安装Windows 11 系统。 2、首先我们通过官网如下地址:https://www.ventoy.net/cn/,找到我们对应系统的Ventoy 软件安装包。 3、通过官网可以找到软件包的地址地址,如下图所示。 4、如下就是我下…...

android 双屏异显-学习笔记

双屏异显 日常生活中,有时候会遇到 Android 设备连接两个屏幕进行显示的问题,比如酒店登记信息时,一个屏幕用于员工操作,一个屏幕显示相关信息供顾客查看。这里就涉及到 Android 的双屏异显的问题,实现Android 的双屏异显,Google 也提供了相应的 API方法 Presentation。…...

Android Lottie 体积优化实践:从 6.4 MB 降到 530 KB

一、说明 产品提出需求:用户有 8 个等级,每个等级对应一个奖牌动画。 按照常用的实现方式: 设计提供 8 个 lottie 动画(8 个 json 文件)。研发将 json 文件打包进入 APK 中。根据不同等级播放指定的动画。 每一个 …...

Django前端页面-模板继承

通过模板的继承&#xff0c;可以将所有共同的前端页面移到母版&#xff0c;那么其他页面就可以用到母版了。 这是母版 <!DOCTYPE html> <html><head>{% block css %}{% endblock %}</head><body><h1>母版</h1><div><!-- …...

使用HTML、CSS和JavaScript编写一个注册界面(一)

倘若文章或代码中有任何错误或疑惑&#xff0c;欢迎提出交流哦~ HTML和CSS 首先&#xff0c;我们需要编写一个简洁的注册界面。 简单编写下&#xff0c;如下&#xff1a; 呈现效果为&#xff1a; <!DOCTYPE html> <html lang"en"><head><me…...

什么是档案数字化管理

档案数字化管理指的是将传统的纸质档案转换为数字形式&#xff0c;并通过电子设备、软件和网络技术进行管理和存储的过程。 档案数字化管理包括以下几个步骤&#xff1a; 1. 扫描和数字化&#xff1a;将纸质档案通过扫描仪转换为数字图像或文档。可以使用OCR&#xff08;光学字…...

vuInhub靶场实战系列--prime:1

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 nmap主机扫描2.1.3 arp-scan主机扫描 2.2 端口扫描…...

基于OpenClaw与TDX API的智能停车查询技能开发实战

1. 项目概述&#xff1a;一个能听懂人话的停车位“雷达”如果你和我一样&#xff0c;经常在台北、新北这些城市里开车找车位&#xff0c;那你一定懂那种绕了半小时、看着导航APP上一个个“车位已满”的绝望感。市面上的停车APP不少&#xff0c;但要么信息更新慢&#xff0c;要么…...

从Arrays.fill()到Stream API:Java二维数组初始化的几种高效写法与性能对比

从Arrays.fill()到Stream API&#xff1a;Java二维数组初始化的几种高效写法与性能对比 在算法竞赛和数据处理应用中&#xff0c;二维数组的初始化往往是性能优化的第一个瓶颈。我曾在一个图像处理项目中&#xff0c;因为选择了不当的初始化方式&#xff0c;导致整体性能下降了…...

【力扣100题】22. 矩阵置零

一、题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0&#xff0c;则将其所在行和列的所有元素都设为 0。请使用原地算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; …...

Memor:为LLM对话构建结构化记忆引擎,实现可重现、可移植的AI交互管理

1. 项目概述&#xff1a;Memor&#xff0c;为LLM对话赋予结构化记忆如果你和我一样&#xff0c;长期和各类大语言模型打交道&#xff0c;从早期的GPT-3到现在的Claude、Gemini&#xff0c;一个绕不开的痛点就是&#xff1a;对话历史的管理。默认的聊天界面里&#xff0c;历史记…...

告别格式烦恼:北航毕业论文LaTeX模板的5步终极指南

告别格式烦恼&#xff1a;北航毕业论文LaTeX模板的5步终极指南 【免费下载链接】BUAAthesis 北航毕设论文LaTeX模板 项目地址: https://gitcode.com/gh_mirrors/bu/BUAAthesis 还在为毕业论文格式调整而烦恼吗&#xff1f;想象一下&#xff0c;你已经花费数月时间完成了…...

如何零成本测试ZPL标签?Virtual ZPL Printer终极解决方案揭秘

如何零成本测试ZPL标签&#xff1f;Virtual ZPL Printer终极解决方案揭秘 【免费下载链接】Virtual-ZPL-Printer An ethernet based virtual Zebra Label Printer that can be used to test applications that produce bar code labels. 项目地址: https://gitcode.com/gh_mi…...

xhs签名验证机制详解:如何绕过小红书反爬虫系统的终极指南

xhs签名验证机制详解&#xff1a;如何绕过小红书反爬虫系统的终极指南 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs 在小红书数据爬取领域&#xff0c;xhs签名验证机制是开…...

如何快速掌握歌词滚动姬:新手到专家的5个终极秘籍

如何快速掌握歌词滚动姬&#xff1a;新手到专家的5个终极秘籍 【免费下载链接】lrc-maker 歌词滚动姬&#xff5c;可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 还在为音乐配上精准的LRC歌词而烦恼吗&#xff1f;歌词…...

终极免费跨平台Steam创意工坊下载器:告别重复购买,轻松获取1000+游戏模组

终极免费跨平台Steam创意工坊下载器&#xff1a;告别重复购买&#xff0c;轻松获取1000游戏模组 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在Epic Games Store或GOG…...

Shell脚本守护工具sh-guard:提升Linux自动化脚本可靠性

1. 项目概述&#xff1a;一个被低估的Shell脚本守护神 如果你经常和Linux服务器打交道&#xff0c;或者需要编写一些自动化运维、部署、监控的Shell脚本&#xff0c;那你一定遇到过这样的场景&#xff1a;脚本在后台运行&#xff0c;突然因为网络波动、资源不足、依赖服务异常而…...