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、一切正常工作!

__declspec(dllimport) 和 __declspec(dllexport)的使用详解、以及 XX_API 的含义的更多相关文章

  1. __declspec(dllimport)与__declspec(dllexport)作用总结

    参考自:http://bbs.csdn.net/topics/330169671 __declspec(dllexport):导出符号,也就是定义需要导出函数的dll中给导出函数的函数声明前面加上导出 ...

  2. 详解Hadoop Slots的含义

    Slots是Hadoop的一个重要概念.然而在Hadoop相关论文,slots的阐述难以理解.网上关于slots的概念介绍也很少,而对于一个有经验的Hadoop开发者来说,他们可能脑子里已经理解了sl ...

  3. 浅谈__declspec(dllexport)和__declspec(dllimport)

    __declspec(dllimport)和__declspec(dllexport)经常是成对的,在动态链接库中__declspec(dllexport)导出dll中的成员,__declspec(d ...

  4. __declspec(dllexport) 和 __declspec(dllimport)的区别

    最近看MXNet的源码,其中c_api.h中发现遇到__declspec(dllexport) 和 __declspec(dllimport). __declspec(dllexport)用于导出符号 ...

  5. __declspec(dllexport)和__declspec(dllimport) (——declspec方法创建dll的方法已验证ok)

    转载:https://www.cnblogs.com/chengbing2011/p/4084125.html __declspec(dllimport)和__declspec(dllexport)经 ...

  6. Dll学习(二)__declspec用法详解

    __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和 C++语言的ANSI规范,而__declspec是一种 ...

  7. __declspec(dllimport)的作用

    是时候总结一下__declspec(dllimport)的作用了.可能有人会问:__declspec(dllimport)和__declspec(dllexport)是一对的,在动态链接库中__dec ...

  8. [Hive] - Hive参数含义详解

    hive中参数分为三类,第一种system环境变量信息,是系统环境变量信息:第二种是env环境变量信息,是当前用户环境变量信息:第三种是hive参数变量信息,是由hive-site.xml文件定义的以 ...

  9. [数据结构]KMP算法(含next数组详解)

    字符串匹配问题 给定一个字符串 s 和一个要匹配的模式串 p.模式串 p 有可能在 s 中多次出现,请求出模式串 p 在 s 中所有出现的起始位置. 暴力匹配算法 BF 算法思路 在面对字符串匹配问题 ...

  10. extern "C" __declspec(dllexport) __declspec(dllimport) 和 def

    原文:extern "C" __declspec(dllexport) __declspec(dllimport) 和 def 前面的extern "C"  _ ...

随机推荐

  1. Web前端单词大全

    style 修饰width 宽度height 高度title 想说明的text-align 水平对齐方式center 居中 left 居左 right 居右line-height 垂直对齐方式/行高 ...

  2. pgsql 查询结果和查询行数

    select count(*) over () as total, * from test

  3. uniapp 离开界面清除计时器

            onLoad() {             // APP启动引导图逻辑判断显示             if (uni.getStorageSync("startImgSt ...

  4. 城壁 (Rampart)

    题意简述 给定一张 $H \times W $ 的网格图,其中有 \(P\) 个被标记的点,求边长为 \(L\) 或以上的正方形的个数,要求正方形的边不得经过被标记的点. \(1 \le H,W \l ...

  5. 剪裁圆形图片cropie

    <!DOCTYPE html> <html> <head> <script src="https://cdn.bootcss.com/jquery/ ...

  6. 3d-force-graph使用及相关设置

    首先安装3d-force-graph模块到项目依赖: npm install 3d-force-graph 在需要使用的vue页面中导入 import ForceGraph3D from '3d-fo ...

  7. curl 与 header 及 file_get_countents 访问内容时的区别

    在开发中 想用curl 或者是file_get_contents 模拟请求或者是获取数据时 ,经常会发现获取到的内容与想象中的不一样,主要原因在与这两个走得host要走外网,在内网及测试环境下host ...

  8. java8 :: 双冒号传多个参数

    '::'是一种函数式接口的一种书写方法引用的方式 Kind Syntax Examples Reference to a static method ContainingClass::staticMe ...

  9. [2001年NOIP普及组] 求先序排列

    给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入 第一行输入一个字符串表示二叉树的中序排列,第二行输入一个字符串表示二叉树的后序排列. 输 ...

  10. python + uiautomator2 常用公共方法封装

    前言 由于公司UI自动化框架底层用的是Uiautomator2,所以我就用Uiautomator2搭了一套UI自动化框架,思路其实和Appnium一样的. uiautomator2是一个自动化测试开源 ...