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. response status is 500 https://localhost:7129/swagger/v1/swagger.json

    SwaggerGeneratorException: Conflicting method/path combination "GET Test" for actions - To ...

  2. 三步建立自己域名的主页,Github Pages功能简明手册

    [task]把自己的页面上传到git上,用github pages功能托管网页. 准备工作: 1.自己的网页文件 2.有个自己的git账号 3.下载安装git.下载地址https://git-scm. ...

  3. under display camera

    https://yzhouas.github.io/projects/UDC/udc.html https://zhuanlan.zhihu.com/p/389863230 MIPI 2022 Cha ...

  4. Python学习笔记文件读写之遍历目录树

    随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...

  5. C++实现链式表示多项式加法运算

    #include<iostream>#include<cstdlib>using namespace std;#define MAXSIZE 100#define OK 1#d ...

  6. ASP.NET Core中使用日志组件NLog

    上一篇文章描述了如何在ASP.NET Core中使用Log4Net记录日志.本篇将使用另外一个组件NLog在ASP.NET Core中记录日志. 1.引入程序集 NLog.Web.AspNetCore ...

  7. Java流程控制之for循环

    for循环[重点] 虽然所有的循环结构都可以用while或者do...while表示,但Java提供了另一种语句--for循环,使一些循环结构变得更加简单. for循环语句是支持迭代的一种通用结构,是 ...

  8. python如何实现对word内段落文本及表格的读取

    在以下方法中用到的三方库是:python-docx from docx import Document 获取指定段落的文本 def get_paragraph_text(path, n): " ...

  9. Java基础——二维数组

    package com.zhao.demo; public class Demo08 { public static void main(String[] args) { //二维数组 int[][] ...

  10. python菜鸟学习: 3.浅copy使用场景

    # -*- coding: utf-8 -*-import copy# 浅copy# 使用场景,比如A,B夫妻共有一个银行账户,存取马宁的数据username = ["name", ...