dllimport 和 dllexport
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的更多相关文章
- 在C++类中使用dllimport和dllexport导出,
在Windows平台下: 您可以使用dllimport或dllexport属性声明C ++类.这些形式意味着导入或导出整个类.以这种方式导出的类称为可导出类. 以下示例定义可导出的类.导出其所有成员函 ...
- C++ 类中使用dllimport和dllexport
在Windows平台下: 您可以使用dllimport或dllexport属性声明C ++类.这些形式意味着导入或导出整个类.以这种方式导出的类称为可导出类. 以下示例定义可导出的类.导出其所有成员函 ...
- 动态链接库(dll) __declspec(dllimport) __declspec(dllexport)
一. __declspec(dllexport) Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __export,使编译器得以自动生成导出名并将它们放到一个 .lib ...
- VS下 dllimport与dllexport作用与区别
我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话 ...
- dllimport与dllexport作用与区别
我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话 ...
- 浅谈__declspec(dllexport)和__declspec(dllimport)
__declspec(dllimport)和__declspec(dllexport)经常是成对的,在动态链接库中__declspec(dllexport)导出dll中的成员,__declspec(d ...
- [转]从普通DLL中导出C++类 – dllexport和dllimport的使用方法(中英对照、附注解)
这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但 ...
- __declspec(dllexport)和__declspec(dllimport) (——declspec方法创建dll的方法已验证ok)
转载:https://www.cnblogs.com/chengbing2011/p/4084125.html __declspec(dllimport)和__declspec(dllexport)经 ...
- DLL输入和输出函数—dllinport与dllexport
Microsoft特殊处 dllimport和dllexport存储类修饰符是C语言的Microsoft特殊处扩充.这些修饰显式定义了DLL的客户界面(可执行的文件或另外的DLL).说明为dllexp ...
- (转)_declspec(dllexport)
先看代码:以下是在dev-c++里建立自已的dll时的dll.h里面的代码,这里面有一个:_declspec(dllexport) #ifndef _DLL_H_#define _DLL_H_//防重 ...
随机推荐
- [转帖]Linux下非oracle用户如何使用系统认证方式登陆数据
https://www.cnblogs.com/kerrycode/p/17772866.html Linux系统中,DBA一般使用oracle用户登陆/访问Linux操作系统,然后使用sqlplus ...
- [转帖]Kafka之ISR机制的理解
Kafka对于producer发来的消息怎么保证可靠性? 每个partition都给配上副本,做数据同步,保证数据不丢失. 副本数据同步策略 和zookeeper不同的是,Kafka选择的是全部完成同 ...
- VM PowerCli的简单安装和使用学习
1. Win10 上面安装 下载 zip包并且进行安装 win10 已经带了powershell 安装比较简单, 只不过安装时会提示 powershell的权限有问题需要打开powershell 执行 ...
- 不同信创服务器Redis7.0.5性能表现总结
不同信创服务器Redis7.0.5性能表现总结 背景以及基础约定 随着美帝2022.10收紧EAR规定的硬件出口规定 信创事业迎来了一波新的高潮. 最近不仅仅要求国产化的硬件. 更要求国产化的OS,以 ...
- pytest-数据驱动
今天介绍两种实现数据驱动的方法,json和excel,我们以获取企业微信token接口为例,共 有两个参数corpid&corpsecret 一.json 方法一:@pytest.mark.p ...
- 手写模拟Spring底层原理-Bean的创建与获取
作者:京东物流 张鼎元 1 引言 大家好,相信大家对Spring的底层原理都有一定的了解,这里我们会针对Spring底层原理,在海量的Spring源代码中进行抽丝剥茧手动实现一个Spring简易版本, ...
- 解决node与npm版本不一致,出现npm WARN npm npm does not support Node.js v15.14.0
出现node与npm版本不一致 今天我升级了node之后,出现的了如下信息 npm WARN npm You should probably upgrade to a newer version of ...
- 开发QQ官方机器人
QQ 频道机器人开发简明教程 1. 简介 QQ 频道机器人是一种可以在 QQ 频道中与用户进行互动的服务.这个教程旨在帮助新手学习如何使用 Python 的官方SDK,快速实现一些基本的机器人功能. ...
- 热门数据集提供【MNIST、鸢尾花、猫狗、CIFAR10、vegetables、Ox-Flowers17、pascalvoc】
热门数据集提供[MNIST.鸢尾花.猫狗.CIFAR10.vegetables.Ox-Flowers17.pascalvoc] 简介: 鸢尾花数据集: 约150条数据,每条样本4个属性,共3个类别 M ...
- 从嘉手札<2023-10-30 >
杂诗 壬戌辛酉日夜,闲看日月,秋风萧瑟,感怀予身期年孑然,岁月难留,故有所感,藉以此诗. 闲来无事,细数春秋. 初月难盈,残烛易收. 未若知人意,夜夜息绝游. 红叶醉天水,星河绕满楼. 竹影戚戚乱,岁 ...