首页 > 其他分享 >__declspec(dllimport) 和 __declspec(dllexport)的使用详解、以及 XX_API 的含义

__declspec(dllimport) 和 __declspec(dllexport)的使用详解、以及 XX_API 的含义

时间:2022-11-04 18:45:49浏览次数:60  
标签:__ 文件 头文件 lib 项目 dllimport declspec dll 链接

1. C++代码里调用别人的库、或者写库给别人用、大概有如下的方法(只讨论windows系统的情况):

---- a) 提供头文件 h 、 静态库 lib  -- 》 静态链接

---- b) 提供头文件 h、  动态库 dll 、库文件 lib  --》动态链接:虽然有lib文件、但这个lib文件只是对 dll 文件的说明、其实编译出来就会发现这个 lib 文件比静态链接时的 lib 文件小很多!

---- c ) 只提供 h、 dll   -- 》也是动态链接,但没有 lib 文件很容易弄出 link error 、想用这个 dll 里的函数就必须动态加载!

要把握住一个核心:头文件只有函数和变量的声明(declaration)、而真正的函数体、或者说是定义(definition) 是在 cpp、lib、dll三者之中!(规范的来说、不在 h 文件写实现代码)

你如果不调用具体的函数、那就一切相安无事、但一旦调用、却不给 vs 函数的实现、那就是 linkerr

顺便说一下、不存在头文件的修复方法:  添加附加库目录即可、实在不行可以 #include"../../.../foo.h" 这样写相对路径、反正很好解决。

至于动态链接和静态链接的区别、百度一下就知道了、不过可以简单认为:静态链接会和真正的程序代码打包到一个exe中、而dll不是,毕竟玩单机游戏时删了一个dll就全废了!

有了这个认识、下面来讲一下怎么用 VS 2019 生成 dll 文件、并导入别的项目使用:


 首先:造一个解决方案、里面造两个项目(其实可以造两个 solution、不过那样得来回切换!应该熟悉一下多项目解决方案怎么玩!)

右击 Deps 项目、打开属性面板(这个项目里假设写一些工具、然后把这个项目做成dll、给 MainApp使用!)

咱们把 输出的dll 和 lib 都放在解决方案文件存在的那个目录下的Output目录

并且设置输出类型是 dll

 

然后在这个项目里的Utils.h定义一个要导出的函数: 

简单实现:

 接下来、build dll、右击Deps 项目、生成!:

打开 OutPut文件夹、应该可以看到有一个很小的 lib 文件和一个dll文件:

 

 下面、编辑 MainApp的项目属性、注意最后的exe也输出到 Output中、这样的话执行起来就能找到 dll 的位置:

并且要添加 刚才制作出来的lib文件(配链接需要两步走):

 

然后正式写代码:

这里写个函数声明、加上 dllimport

 把 main app 设为启动项目(右击项目、然后容易找到),运行、一切正常!:

但我们不想把声明放在 cpp 中、那怎么办?用头文件!

这个东西里的内容和 Deps 工程的Utils.h 内容基本一样,除了这里是要进行导入:

那我们用头文件就行了:

 

也能正常运行:

 


 

那么既然这两个头文件的内容除了 import 和 export 有区别之外、别的都没区别、那么肯定有如下的写法成立:

 这样、这个 Utils.h 就可以在 both 依赖项目 和 被依赖项目同时使用、只是简单修改一下编译时的参数、指定一个 IMPORT 或者是 EXPORT就行:

这样设置预处理时的宏

发现在 Dep 工程里的 Uitls文件出现了高亮:

 接下来可以移除MainApp里的那个头文件、用相对路径去导入:

 同样在 MainApp 项目里设置 IMPORT 宏:

生成 Deps工程、再运行 MainApp、一切正常工作!

 

 

 

 

 

标签:__,文件,头文件,lib,项目,dllimport,declspec,dll,链接
From: https://www.cnblogs.com/gs590/p/16858689.html

相关文章

  • ysoserial CommonsColletions2分析
    前言在CC2中是用的PriorityQueue#reaObject作为反序列化的入口,利用javassist创建了一个攻击类,使用TemplatesImpl类来承载他而CC1利用链在JDK1.88u71版本以后是无法使用......
  • Appium 踩坑记录
    1.安装condahttps://docs.conda.io/en/latest/miniconda.html2.配置conda代理https://www.jianshu.com/p/fc5dc0938bf5https://www.cnblogs.com/ytikewk/p/16471636.htm......
  • NB的Github项目,看到最后一个我惊呆了!
    最近看到不少好玩的、实用的Github项目,就来给大家推荐一把。中国制霸生成器最近在朋友圈非常火的一个小网站,可以在线标记居住、短居、游玩、出差、路过标记后可生成......
  • 服务器大量大文件拆分切割打包文件上传云盘方案
    分卷压缩研究:要将文件test.pdf分包压缩成500bytes的文件:tarczf-test.pdf|split-b500-test.tar.gz最后要提醒但是那两个"-"不要漏了,那是tar的ouput和split的input......
  • gorm
    特性全功能ORM关联(HasOne,HasMany,BelongsTo,ManyToMany,多态,单表继承)Create,Save,Update,Delete,Find中钩子方法支持Preload、Joins的预加载事务,嵌套事务,SaveP......
  • Oracle数据库知识总结
    一、Sql语句1.1查询语句order排序(其中含有null)查询雇员的奖金并做降序排序(关于nullsfirst/nullslast)​​​selectename,commfromemporderbycommdescnulls......
  • Nginx配置ssl实现https访问
    导航​​一、申请SSL证书​​​​1.1阿里云服务器首页​​​​1.2SSL证书页面​​​​1.3SSL证书购买详情页​​​​1.4SSL证书申请​​​​1.5SSL证书DNS解析​​​​......
  • Photoshop如何改变背景底色并调整照片尺寸和图像大小
    视频介绍:​​https://www.bilibili.com/video/BV1f54y1e7ZJ/​​一、改变证件照背景色选择魔棒工具后,点击证件照的底色,然后反选(​​Ctrl+Shift+i​​)复制选中的选区......
  • 如何设计网页排版和样式 - 前端页面设计
    经过前端页面的优化,请教别人和别人的建议总结出来的两句话,希望可以有所帮助对于没有设计天赋的朋友,不妨可以思考一下下面三句话.设计这东西一定要找素材.自己凭空想......
  • Tomcat启动startup.bat一闪而过 - JavaWeb
    emm,首先呢,先看你的环境变量,是否​​JAVA_HOME​​这一项.后面的路径是主目录如果有这个,你的startup.bat还是一闪而过的话,那么我感觉就不是你机器的问题了,这就应......