Dll 在需要暴露接口的头文件里添加 dllexport 声明,比如,

#define DllExport   __declspec( dllexport )

class DllExport C {
int i;
virtual int func( void ) { return 1; }
};

  

注意,禁止对可导出类的成员显式使用 dllimport 和 dllexport 特性。

我们一般情况下会使用预定义宏控制 dll 接口的导入导出,比如,

#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */ #ifdef __PROJECT_OS_WIN32__
#define PROJECT_API __stdcall
#define DLLIMPORT_C extern __declspec(dllimport)
#define DLLEXPORT_C __declspec(dllexport)
#else
#define PROJECT_API
#define DLLIMPORT_C
#define DLLEXPORT_C __attribute__((visibility("default")))
#endif // __PROJECT_OS_WIN32__ #ifdef __PROJECT_SOURCE__
#define PROJECT_EXPORT DLLEXPORT_C
#else
#define PROJECT_EXPORT DLLIMPORT_C
#endif // __PROJECT_SOURCE__ PROJECT_EXPORT int PROJECT_API project_init(struct xxx**ctx, int x);

  

这样,我们只要在 Dll 的工程里添加 __PROJECT_OS_WIN32__ 和 __PROJECT_SOURCE__ 预定义宏就可以导出 project_init 接口

同样,我们在使用的时候只要在项目中添加 __PROJECT_OS_WIN32__  即可导入 project_init 接口,当然,项目中要包含相关接口的头文件

参考:

拓展:

上述第二个链接中提到了 .def 文件,添加该文件也是为了暴露接口,后续可以研究研究


更新:

.def 文件似乎对依赖的静态库暴露的函数无法起到限制作用

缘由:我们在项目中自编译了一个工具静态库,这个库里的函数是由 BASE_EXPORT 做前缀组成,我们在 CMakeLists 中使用 add_subdirectory 添加了子静态库后,最终编译出我们需要的可执行程序,在使用 dumpbin /exports 查看 exe 文件暴露的函数,发现除了预期的 main 函数,还有很多子库的函数,理论上这些子库是不应该暴露的

猜测:在没有编译子静态库时,我们是在主项目中直接调用子文件夹中的源码,那时并没有暴露子文件夹的函数,所以问题是出现在编译成静态库当中

我们知道静态库中所有的函数其实都是暴露给调用的项目的,因为最终主项目在编译过程中,是在链接的过程中到静态库中找到对应的符号文件,而 BASE_EXPORT 并没有阻止主项目中的静态库函数暴露出来

相反,dll 动态库是可以做到这点,究其原因,得后续研究研究了

解决方法:因为静态库的函数是全暴露的,那么我们就不用 #define BASE_EXPORT __declspec(dllexport) 额外暴露的,最后发现主项目编译后没有暴露静态库的函数

旧的:

#if defined(WIN32)
#define BASE_EXPORT __declspec(dllexport)
#else
#define BASE_EXPORT __declspec(dllimport)
#endif

  

新的:

#if defined(PROJECT_EXPORT)
#if defined(WIN32)
#define BASE_EXPORT __declspec(dllexport)
#else
#define BASE_EXPORT __attribute__((visibility("default")))
#endif
#else
#define BASE_EXPORT
#endif

  

dllimport 和 dllexport的更多相关文章

  1. 在C++类中使用dllimport和dllexport导出,

    在Windows平台下: 您可以使用dllimport或dllexport属性声明C ++类.这些形式意味着导入或导出整个类.以这种方式导出的类称为可导出类. 以下示例定义可导出的类.导出其所有成员函 ...

  2. C++ 类中使用dllimport和dllexport

    在Windows平台下: 您可以使用dllimport或dllexport属性声明C ++类.这些形式意味着导入或导出整个类.以这种方式导出的类称为可导出类. 以下示例定义可导出的类.导出其所有成员函 ...

  3. 动态链接库(dll) __declspec(dllimport) __declspec(dllexport)

    一. __declspec(dllexport) Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __export,使编译器得以自动生成导出名并将它们放到一个 .lib ...

  4. VS下 dllimport与dllexport作用与区别

    我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话 ...

  5. dllimport与dllexport作用与区别

    我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话 ...

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

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

  7. [转]从普通DLL中导出C++类 – dllexport和dllimport的使用方法(中英对照、附注解)

      这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但 ...

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

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

  9. DLL输入和输出函数—dllinport与dllexport

    Microsoft特殊处 dllimport和dllexport存储类修饰符是C语言的Microsoft特殊处扩充.这些修饰显式定义了DLL的客户界面(可执行的文件或另外的DLL).说明为dllexp ...

  10. (转)_declspec(dllexport)

    先看代码:以下是在dev-c++里建立自已的dll时的dll.h里面的代码,这里面有一个:_declspec(dllexport) #ifndef _DLL_H_#define _DLL_H_//防重 ...

随机推荐

  1. [转帖]linux系统上free命令看到的buff/cache到底是什么

    https://zhuanlan.zhihu.com/p/645904515 上周二一大早,小智准备早点去公司肝一篇技术文分享给大家的,哪成想,一到公司就被测试部的"卷王"拉去看问 ...

  2. [转帖]详解:Linux Chrony 设置服务器集群同步时间

    https://www.linuxprobe.com/centos7-chrony-time.html 导读 Chrony是一个开源的自由软件,像CentOS 7或基于RHEL 7操作系统,已经是默认 ...

  3. [转帖]金仓数据库KingbaseES误删除系统超级用户(superuser)权限的恢复方式

    https://blog.csdn.net/arthemis_14/article/details/129879269 在使用KingbaseES数据库的时候,系统默认存在一个跟系统初始化用户同名的S ...

  4. [转帖]Windows自带硬盘测试工具使用教程

    本教程主要讲解Windows自带的硬盘测试工具的使用,不用再安装第三方软件了.到底准不准就不知道啦,下面我们来看看如何使用吧~ 1. 进入cmd 快速进入cmd 主要如果进入后,使用命令直接闪退,就是 ...

  5. [转帖]拜托!面试请不要再问我Spring Cloud底层原理

    https://www.cnblogs.com/jajian/p/9973555.html 概述# 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大 ...

  6. 二进制安装Mysql数据库的快速方法

    二进制安装Mysql数据库的快速方法 摘要 还是国产操作系统 rpm包可能不太兼容,为了简单准备使用tar包方式安装mysql数据库 这里简单记录一下过程. 为以后使用. 介质下载 下载二进制的tar ...

  7. React Hooks源码深度解析

    作者:京东零售 郑炳懿 前言 React Hooks是React16.8 引入的一个新特性,它允许函数组件中使用state和其他 React 特性,而不必使用类组件.Hooks是一个非常重要的概念,因 ...

  8. elementUI(datepicker)限制日日期的选择

    指定起始日期,后选的将会受到先选的限制 参考地址 https://www.jianshu.com/p/c59c8ef6c500 实现方法不难,利用了 change 事件,动态改变 picker-opt ...

  9. 【学到一个小技巧】context.WithValue 中的 key 可以是个空对象

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 从 netpoll 库看到这段代码: type connk ...

  10. 【JS 逆向百例】webpack 改写实战,G 某游戏 RSA 加密

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...