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文件用于链接时解析符号引用。

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

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

相关文章

甜蜜约会网页制作html

创建一个简单的“甜蜜约会”主题网页&#xff0c;你需要编写HTML代码来定义网页的结构和内容。下面是一个基本的HTML页面示例&#xff0c;它展示了一个简单的“甜蜜约会”网页布局&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><met…

vivado BEL

描述 通常&#xff0c;BEL或基本元素对应于设计的网表视图中的叶单元。 BEL是目标Xilinx FPGA上的设备对象&#xff0c;用于放置或映射基本网表 触发器、LUT和进位逻辑等对象。 BEL在SITE对象&#xff08;如SLICE和IO块&#xff09;中的设备上分组在一起 &#xff08;IOB&#…

PostgreSQL专家(pcp51)--王丁丁

#PostgreSQL培训 #postgresql认证 #postgreSQL考试 #PG考试 #PG培训

雨课堂课件快速自动刷完

文章目录 背景f12检查 查看源代码脚本脚本使用方法总结 背景 有时候老师让我们在雨课堂里刷完这个课件。这个课件呢有时候它有三百多页&#xff0c;每一页需要停留3秒左右才可以算看过课件&#xff0c;你如果一页一页的去点的话非常的折磨人。因为课件太多页了&#xff0c;我就…

【数据库】SQL--DQL(初阶)

文章目录 DCL1. 基本介绍2. 语法2.1 基础查询2.2 条件查询2.3 聚合函数2.4 聚合查询2.5 分组查询2.6 排序查询2.7 分页查询2.8 综合案例练习2.9 执行顺序 3. DQL总结 DCL 更多数据库MySQL系统内容就在以下专栏&#xff1a; 专栏链接&#xff1a;数据库MySQL 1. 基本介绍 DQL英…

GLM-4-9B性能究竟如何?

GLM-4-9B 开源系列模型 前言 自 2023 年 3 月 14 日 ChatGLM-6B 开源以来&#xff0c;GLM 系列模型受到广泛认可。特别是在 ChatGLM3-6B 开源后&#xff0c;针对让小模型能够拥有更为强大的能力这一目标&#xff0c;GLM 技术团队展开了诸多的探索性工作。历经将近半年的探索历程…

风机5G智能制造工厂工业物联数字孪生平台,推进制造业数字化转型

风机5G智能制造工厂工业物联数字孪生平台&#xff0c;推进制造业数字化转型。在信息化、智能化的浪潮中&#xff0c;风机5G智能制造工厂工业物联数字孪生平台正以其独特的优势&#xff0c;推动制造业实现数字化转型。数字孪生平台不仅为风机制造业带来了前所未有的机遇&#xf…

[论文阅读] ZeRo

zero主要用于数据并行 对于大模型来说&#xff0c;内存主要用来保存模型状态&#xff0c;主要有 模型参数&#xff0c;梯度&#xff08;梯度和模型大小是一样的&#xff09;&#xff0c;优化器状态&#xff08;adam中需要保存momentum和variance信息&#xff09;。所有中间值…

计算机图形学入门06:视口变换

在前面的内容中&#xff0c;在MVP变换(模型变换&#xff0c;视图变换&#xff0c;投影变换)完后&#xff0c;所有的物体位置都变换到了[-1, 1]的标准立方体里&#xff0c;下一步要把物体绘制到屏幕(Screen)上。 1.什么是屏幕&#xff1f; 对于图形学来说把屏幕抽象的认为是一个…

flask项目结构心得

flask 项目没有标准的项目结构&#xff0c;合理组织&#xff0c;确保能跑&#xff0c;可配置&#xff0c;可拓展、模型可被发现就行。 一般可以分为两种 按模型&#xff08;业务&#xff09;划分 按功能划分&#xff0c;就是api、models、config、db、service等 按模型&…

mac Network: use --host to expose

本地启动无法访问&#xff0c;这个不是权限问题是mac 主机端口安全策略&#xff0c;现在我们只需要开启端口自动检测就可以 npm run dev --host 网络&#xff1a;未暴露 方案一 1、执行 npm run dev -- --host 方案二 1、请在 vite.config.js server: {host: true } 1…

给快高考的儿子的一封信:关于选择计算机专业

亲爱的儿子&#xff0c; 你好&#xff01; 时间过得真快&#xff0c;转眼间你就要高考了&#xff0c;这不仅是你人生中的一个重要时刻&#xff0c;也是我们全家都非常关注的节点。妈妈告诉我&#xff0c;你对计算机专业很感兴趣&#xff0c;希望我能给你一些建议。我很高兴听…

使用手机小程序给证件照换底色

临时遇到一个需求&#xff0c;需要给证件照换底色。原始图像如下 最终需要换成红底的。 本次使用一款小程序&#xff02;泰世茂证件照&#xff02;&#xff0c;打开该小程序&#xff0c;如下图所示 单击开始制作&#xff0c;然后选择二寸红底&#xff0c;如下图所示 然后单击相…

逗拍短视频:成都鼎茂宏升文化传媒公司

逗拍短视频&#xff1a;欢乐瞬间的创意呈现 在当下这个快节奏、信息化的时代&#xff0c;逗拍短视频以其独特的魅力&#xff0c;成为了人们生活中不可或缺的一部分。成都鼎茂宏升文化传媒公司它以其简短、有趣、富有创意的特点&#xff0c;迅速俘获了广大网友的心&#xff0c;…

Docker高级篇之安装Redis集群(分布式存储案例)

文章目录 1. 案例场景2. 3主3从redis集群扩缩容配置案例架构说明3. 3主3从redis集群扩缩容配置案例搭建4. 主从容错切换迁移案例5. 主从扩容6. 主从缩容 1. 案例场景 1&#xff5e;2亿条数据需要缓存&#xff0c;如何设计这个存储案例&#xff1f;这种情况下单机存储100%是不可…

社区待就业人员信息管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;工作岗位管理&#xff0c;基础数据管理&#xff0c;预约面试管理&#xff0c;就业信息管理&#xff0c;公告信息管理 社区工作账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户…

做自媒体素材哪里找?做自媒体必备的几个高质量素材网站分享

在自媒体的世界里&#xff0c;内容是王道。无论是视频还是文章&#xff0c;优秀的自媒体作品都需要有力的内容和高质量的素材作支撑。今天&#xff0c;我为大家整理了一些优质的素材网站&#xff0c;帮助每一位自媒体创作者&#xff0c;无论新手还是老手&#xff0c;都能找到适…

文件夹如何加密码?这4个文件夹加密方法值得一试!

文件夹如何加密码&#xff1f;在与朋友、家人和同事共享同一电脑计算机时&#xff0c;您可能有一些不希望他们查看的重要或机密文件。那么如何避免这种情况呢&#xff1f;使用密码保护锁定文件和文件夹可以提高你的数字隐私和安全性&#xff0c;因为这意味着你需要输入密码才能…

每天CTF小练一点--ctfshow年CTF

初一 题目&#xff1a; 2023是兔年&#xff0c;密码也是。聪明的小伙伴们&#xff0c;你能破解出下面的密码吗&#xff1f; 感谢大菜鸡师傅出题 flag格式是ctfshow{xxxxxx}.或许密码也有密码。 密文是&#xff1a; U2FsdGVkX1M7duRffUvQgJlESPfOTV2i4TJpc9YybgZ9ONmPk/RJje …

修复Windows上“发生意外错误”问题的5种方法,总有一种适合你

在尝试启动网络适配器的设置菜单时,是否收到“发生意外错误”消息?不用担心,因为在大多数情况下解决这个问题很容易。我们将向你展示在Windows 11或Windows 10计算机上解决此问题的多种方法。 为什么我收到“发生意外错误”的消息 当网络适配器出现问题时,Windows会显示一…