c/c++创建动态导出库模版

本文深入探讨了在跨平台环境中使用预处理器宏定义来控制DLL导出的机制。通过具体的代码示例,展示了如何根据不同编译环境(如Windows)调整符号导出属性,实现动态链接库(DLL)中函数的正确导出。
#ifndef __EXPORT__H_
#define __EXPORT__H_

#if defined WIN32 || defined _WIN32
#if defined DLL_EXPORT
#define EXPORTAPI   __declspec( dllexport )
#else
#define EXPORTAPI
#endif
#endif

extern "C" {
    EXPORTAPI void Say();
}
#endif

 

### 如何在 Visual Studio 中创建 C/C++ 动态链接(DLL) #### 创建 DLL 项目 在 Visual Studio 中创建 C/C++ 动态链接的过程可以分为以下几个方面: 1. 打开 Visual Studio,点击 **“文件” → “新建” → “项目”**。 2. 在弹出的新建项目窗口中,选择 **“动态链接 (DLL)”** 类型的模板[^2]。输入项目的名称以及保存位置后,点击 **“确定”**。 #### 声明和定义函数接口 为了使其他应用程序能够调用 DLL 提供的功能,需要对外暴露一些函数接口。这通常通过头文件 `.h` 和实现文件 `.cpp` 来完成。 - **创建头文件 (`MyC++_Dll.h`)** 头文件主要用于声明那些希望公开给外部使用的函数或变量。例如,在 `MyC++_Dll.h` 文件中,可以通过宏定义的方式指定导出符号[^1]。 ```c++ #pragma once #ifdef MY_DLL_EXPORTS #define MY_API __declspec(dllexport) #else #define MY_API __declspec(dllimport) #endif extern "C" { MY_API int add(int a, int b); } ``` - **创建源文件 (`MyC++_Dll.cpp`)** 实现上述头文件中声明的函数逻辑。例如,在 `MyC++_Dll.cpp` 文件中提供具体的计算功能。 ```cpp #include "MyC++_Dll.h" #include <iostream> using namespace std; MY_API int add(int a, int b) { cout << "DLL 被调用了!" << endl; return a + b; } ``` #### 配置项目属性 为了让编译器知道哪些函数应该被导出至 DLL,需设置项目属性中的预处理器选项。 1. 右键单击解决方案资源管理器中的项目名,选择 **“属性”**。 2. 导航到 **“配置属性” → “C/C++” → “预处理器”**,向预处理器定义列表添加 `MY_DLL_EXPORTS` 宏[^4]。 #### 编译生成 DLL 文件 当所有代码编写完毕并正确设置了项目属性之后,就可以构建该项目以生成目标 DLL 文件。成功编译后,会在输出目录找到名为 `<ProjectName>.dll` 的文件。 #### 使用生成的 DLL 一旦 DLL 成功生成,它可以在另一个独立的应用程序里加载使用。一种常见方式是利用 Windows API 函数 `LoadLibrary()` 加载 DLL,并通过 `GetProcAddress()` 获取特定函数地址来执行操作。 ```cpp #include <windows.h> #include <stdio.h> typedef int(*AddFunction)(int, int); int main() { HINSTANCE hInstance = LoadLibrary(L"MyC++_Dll.dll"); if (!hInstance) { printf("无法加载 DLL\n"); return -1; } AddFunction addFunc = reinterpret_cast<AddFunction>(GetProcAddress(hInstance, "add")); if (!addFunc) { FreeLibrary(hInstance); printf("无法获取 'add' 地址\n"); return -1; } int result = addFunc(5, 7); printf("Result of addition is %d\n", result); FreeLibrary(hInstance); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值