首页 > 其他分享 >同一个头文件既可以用于编译 DLL,也可以用于链接到 DLL 的客户端代码

同一个头文件既可以用于编译 DLL,也可以用于链接到 DLL 的客户端代码

时间:2024-11-10 12:19:24浏览次数:6  
标签:__ 头文件 mylib declspec DLL 客户端

利用条件编译 (#ifdef ALGLIB_EXPORTS) 和 DLLAPI 宏的设置,可以让同一个头文件既适用于 DLL 库的编译,也适用于依赖该 DLL 的客户端代码。具体来说:

  • 在编译 DLL 时:头文件中的 DLLAPI 通过条件编译定义为 __declspec(dllexport),标记这些函数是要被 DLL 导出的。这意味着,当编译 DLL 时,这些函数会包含在 DLL 的导出表中,可以被外部程序使用。

  • 在使用 DLL 的客户端代码中:头文件中的 DLLAPI 会被定义为 __declspec(dllimport),标记这些函数是从 DLL 中导入的。这告诉编译器,这些函数的实际实现位于 DLL 中,而不是当前客户端的代码里。

举个例子

假设你有一个名为 mylib 的库,这个库需要生成一个 DLL 文件 mylib.dll,并且有一个头文件 mylib.h,头文件内容如下:

// mylib.h
#pragma once

#ifdef ALGLIB_EXPORTS
#define DLLAPI __declspec(dllexport)
#else
#define DLLAPI __declspec(dllimport)
#endif

DLLAPI void DFT_fc_Direct(/* 参数列表 */);

场景1:编译 DLL 时

  • 在 DLL 项目中(比如 mylib.dll 项目),编译器设置了 ALGLIB_EXPORTS 宏(可以在项目设置中定义)。

  • 这样,头文件中的 DLLAPI 被替换为 __declspec(dllexport),即:

    __declspec(dllexport) void DFT_fc_Direct(/* 参数列表 */);
    
  • __declspec(dllexport) 告诉编译器将 DFT_fc_Direct 函数导出到 mylib.dll 中,使其成为 DLL 的一部分。其他程序可以通过该 DLL 调用 DFT_fc_Direct

场景2:在客户端代码中使用 DLL

  • 在依赖 mylib.dll 的客户端项目中(即一个使用 mylib.dll 的应用程序项目),ALGLIB_EXPORTS 宏未定义。

  • 这样,头文件中的 DLLAPI 被替换为 __declspec(dllimport),即:

    __declspec(dllimport) void DFT_fc_Direct(/* 参数列表 */);
    
  • __declspec(dllimport) 告诉编译器,DFT_fc_Direct 的实现位于 mylib.dll 中,而不在当前的客户端代码中。当客户端代码调用 DFT_fc_Direct 时,链接器会从 mylib.dll 中导入它的实现。

为什么这样设计?

这种设计的目的是为了复用头文件。同一个头文件 mylib.h 可以用于:

  1. 编译 mylib.dll 自身,导出函数。
  2. 在客户端项目中引用 mylib.dll,导入函数。

这种复用避免了编写两个不同的头文件(一个用于 DLL 编译,另一个用于客户端导入),简化了项目管理。

总结

  • 同一个头文件通过条件编译控制,可以在 DLL 编译时导出函数,也可以在客户端使用时导入函数。
  • __declspec(dllexport) 在 DLL 编译时使用,导出函数;__declspec(dllimport) 在客户端使用时使用,导入函数。
  • 这样做的好处是保持头文件的通用性和一致性,无论是编译 DLL 还是在客户端项目中使用,都可以直接引用这个头文件。

标签:__,头文件,mylib,declspec,DLL,客户端
From: https://blog.csdn.net/qq_43689451/article/details/143658900

相关文章

  • Z-Library官网入口镜像网址及客户端合集 (2024持续更新)
    Z-Library(简称Z-Lib,前身为BookFinder)是一个影子图书馆网站,用户可在上面下载期刊、文章以及各类书籍,其共收录了超过1000w本书籍和8000w篇文章。它原是创世纪图书馆(LibraryGenesis)的镜像网站,并从该图书馆获得大部分馆藏,但它的一些馆藏由用户自行上传,并且不为创世纪图书馆所......
  • 电脑中丢失 vcruntime140.dll 的五种解决方法
    vcruntime140.dll是MicrosoftVisualC++2015RedistributablePackage的一部分,它是一个动态链接库(DLL)文件,主要负责为使用了C++编译器编写的应用程序提供运行时支持。简而言之,vcruntime140.dll包含了程序运行所需的基础函数和数据结构,如内存管理、输入输出操作等。因此,对于很......
  • 找不到msvcp120.dll,无法继续执行代码的15种解决方法指南
    msvcp120.dll 是一个动态链接库(DLL)文件,属于MicrosoftVisualC++RedistributablePackages的一部分。它是MicrosoftVisualStudio2013的一个组件,为运行基于VisualC++2013开发的应用程序提供必要的标准C++库支持。1.功能和作用msvcp120.dll文件封装了多种与C+......
  • 【模块一】kubernetes容器编排进阶实战之containerd安装及nerdctl客户端⼯具
    安装containerdapt/yum安装#验证仓库版本[root@k8s-node3~]#apt-cachemadisoncontainerdcontainerd|1.7.12-0ubuntu2~22.04.1|https://mirrors.aliyun.com/ubuntujammy-updates/mainamd64Packagescontainerd|1.6.12-0ubuntu1~22.04.3|https://mirrors.aliyu......
  • zlibrary镜像网址入口,Zlibray最新官方客户端
    Z-Library(也被称为Z-Lib)是一个在线的、开源的、免费的数字图书馆项目,旨在提供各种书籍、文章、科学论文、杂志、漫画等资源的访问。该项目成立于2009年,至今已经收录了超过10,000,000册书籍和80,000,000篇文章。zlibrary电脑客户端/安卓appzlibrary(windows/mac/安卓/ipad)安装包......
  • RTT_t2 提示Expected to be given a valid DLL
    软件:RTT_t2 V2.60环境:WIN1064bit安装好RTT_t2后,运行软件出现以下错误:Traceback(mostrecentcalllast):File"rtt_t2.py",line1304,in<module>File"rtt_t2.py",line1041,inmainFile"bds\bds_jlink.py",line15,in__init__......
  • C++关于DLL导出模板类和模板函数
    这两天写了个Dll,要导出普通类中的模板函数,稍微查了一下,没查到具体资料。自己根据C++模板的编译原理,推断出应该要源码放在头文件中直接导出,查了下接触的OpenSource项目,确实如此。这里记录一下,方便下次查阅。1、宏定义说明:#ifdefDLL_PROJECT#defineTEMPLATE_IM_EXPORT__decl......
  • 为什么找不到vcruntime140_1.dll,无法继续执行代码的原因及五种有效解决方法
    vcruntime140_1.dll是微软VisualC++RedistributableforVisualStudio的一个动态链接库(DLL)文件。它是运行由VisualStudio2015及更高版本编译的C++应用程序所必需的。该DLL文件包含了支持C++标准库和Microsoft特定扩展功能的运行时函数,对于Windows应用程序......
  • d3dcompiler47dll丢失怎么解决lol
    d3dcompiler_47.dll是微软DirectX软件组件套件中的一个动态链接库(DLL)文件,扮演着至关重要的角色。DirectX是微软开发的一套用于多媒体应用,特别是游戏和高级图形处理的应用程序接口(API)。d3dcompiler_47.dll特别与Direct3D子系统相关,负责编译和优化用于Direct3D的着色器......
  • 电脑提示d3dcompiler_47.dll缺失怎么解决?五种方法快速修复存在问题!
    d3dcompiler_47.dll是微软DirectX软件组件套件中的一个动态链接库(DLL)文件,扮演着至关重要的角色。DirectX是微软开发的一套用于多媒体应用,特别是游戏和高级图形处理的应用程序接口(API)。d3dcompiler_47.dll特别与Direct3D子系统相关,负责编译和优化用于Direct3D的着色器......