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,一经查实,立即删除!

相关文章

vivado BEL

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

PostgreSQL专家(pcp51)--王丁丁

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

雨课堂课件快速自动刷完

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

【数据库】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系统内容就在以下专栏: 专栏链接:数据库MySQL 1. 基本介绍 DQL英…

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

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

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

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

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

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

mac Network: use --host to expose

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

老师评职称三证不一致怎么办

对于老师们来说,职称评定无疑是一个重要环节,不仅关系到教师的个人荣誉,更关系到职业发展和薪酬待遇。然而,当遇到教师资格证、任职资格证上的学科与实际所教学科不一致时,职称评定之路似乎变得崎岖不平。面对这样的困…

作业-day-240605

思维导图 C编程 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重 再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1 设计这两个类的构造函数、析构函数。 #include <iostream>using namespace std;class Per{ private:str…

Science项目文章 | 中国农科院作科所研究团队解析“复粒稻”多粒簇生的机制

2024年3月8日&#xff0c;由中国农业科学院作物科学研究所童红宁研究员领衔的研究团队在Science发表题为“Enhancing rice panicle branching and grain yield through tissue-specific brassinosteroid inhibition”的研究论文。该研究报道了复粒稻多粒簇形成的机制&#xff0…