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. 如何把高德地图搜索结果导出成excel里?

    前段时间,根据朋友的要求,开发了百度地图里的商家采集工具. 最近,又开发了腾讯地图里的商家采集工具. 来了兴致,干脆把高德地图的采集工具也一并搞定!:) 原理应该差不多,我就查阅了下高德地图的采集规则 ...

  2. 图像bayer格式介绍

    图像bayer格式介绍 https://zhuanlan.zhihu.com/p/72581663

  3. SAP BPC全面预算及合并解决方案.pdf 电子版

    SAP BPC全面预算及合并解决方案.pdf 电子版 有需要的联系 wx :erpworld

  4. spring注解SQL注意事项

    目前有两个类:机构.职员 package com.common.vo; public class Org{ public long id; public String name; public Str ...

  5. 面试视频知识点整理1-13(mvvm框架)

    1.了解mvvm框架吗? Vue.js React Angular 2.谈谈你对mvvm的认识 由mvc和mvp演变而来 3.双向绑定是什么原理? object.defineProperty的用法要熟 ...

  6. 常见DOS命令及应用

    常见DOS命令使用 CMD打开方式 开始 + 系统 + 命令提示符 WIN键 + R 输入cmd + Enter WIN键 + R 输入cmd + Ctrl + Shift + Enter (管理员模 ...

  7. ABAP学习(34):cl_gui_alv_grid实现Table Maintain

    实现Table Maintain 通过类CL_GUI_ALV_GRID,实现Table Maintain功能. 实现效果: 1.创建Program; 2.创建空Screen 100; 3.创建GUI ...

  8. Mac怎么安装Andriod模拟器

    Mac上怎么安装 Andriod 系统模拟器?有的朋友可能需要在自己用的 Mac 电脑上安装Andriod 系统模拟器,用于开发或测试一些安卓软件.介绍下怎么在 Mac 上用 Parallels De ...

  9. 第八章 mysql的主从复制

    mysql的主从复制 一 主从复制搭建 1. 准备三台主机  (这个是多实例) 3307 master3308 salve13309 salve2 2. master 节点设置 [mysqld] lo ...

  10. 错题笔记:int a=b=1这样定义为什么是错误的

    C语言中定义同一类型的多个变量必须以逗号分隔.如: int a,b,c ; =在C语言中是赋值运算符,等号左边的变量,必须是已以定义好的变量才可以. int a=b=1 ; 中,若b已经定义,则是正确 ...