c++ 中的dll如何引用主程序中的值,extern引入为何无效
时间: 2024-09-13 09:15:22 浏览: 41
C/C++ 中extern关键字详解
在 C++ 中,DLL (动态链接库) 要引用主程序中的变量,通常需要通过几种方式来完成,因为 DLL 的作用域是在其自身的地址空间内,而不会直接访问主程序的数据。当试图使用 `extern` 关键字将变量声明为全局并在 DLL 中引用它时,可能会遇到一些限制。
1. 函数原型声明:如果你希望在 DLL 中使用主程序的函数,可以先在头文件 (.h) 中仅声明函数原型(无实际定义),然后在主程序和 DLL 中分别提供完整定义。例如:
```cpp
// 主程序.h
extern "C" int MyFunction(int value);
// 主程序.cpp
#include "主程序.h"
int MyFunction(int value) {
// 实现...
}
// DLL.h
extern "C" __declspec(dllexport) void UseMyFunction(int value);
```
2. 全局变量导出:对于需要从 DLL 引入的全局变量,可以在 DLL 的 .def 文件中进行显式导出(如 MSVC 中的 `__declspec(dllexport)` 或者 Linux 下的 `__attribute__((visibility("default")))`)。但在使用 `extern` 定义变量时,`extern` 只能在包含该变量定义的地方使用,无法直接在 DLL 中引用。
```cpp
// 主程序.cpp
extern int g_sharedVariable;
// DLL.def
LIBRARY "mydll.lib"
EXPORTS
UseSharedVariable proc near
end LIBRARY
// DLL.cpp
#pragma comment(lib, "mydll.lib") // 需要在编译时链接到这个库
int g_sharedVariable = 0; // 在这里定义并导出
void UseSharedVariable() {
// 访问g_sharedVariable
}
```
由于外部可见性的限制,如果直接在 DLL 中使用 `extern` 来引用主程序中的变量,`extern` 本身并不能跨模块共享数据。此时需要配合其他技术(比如全局变量、静态成员变量等)以及正确的链接步骤来实现共享。
阅读全文