全局外部指针变量在 DLL 中不可见

Posted

技术标签:

【中文标题】全局外部指针变量在 DLL 中不可见【英文标题】:Global extern pointer variable not visible in DLL 【发布时间】:2017-08-03 10:47:20 【问题描述】:

我有一个主应用程序 EXE“main.EXE”。我在头文件 globalf.h 中使用 extern 创建了一个全局指针,例如:

globalf.h

extern SomeClass* cPtr;

现在在 Main.EXE 代码中

#include globalf.h
INitialize()

cPtr = new SomeClass(); // works fine.

D.DLL:

#include "globalf.h"
void DllFunc()

cPtr->someFunction1(); // link error unreslved external symbol.

我无法访问 DLL 代码中的全局指针变量,即使 虽然我已经声明了 inMain.EXE 代码。

我知道 main.EXE 的 Initialize() 中的这个声明对 动态链接库。但是我该如何实现呢? C++中有没有办法处理 跨 DLL 和 EXE 的此类全局变量。

【问题讨论】:

您可能应该阅读What happens to global and static variables in a shared library when it is dynamically linked?。也许Sharing a global/static variable between a process and DLL 也是如此。或using global variable in dll and exe. 或者通过搜索exe dll shared global variable提供的任何链接。 【参考方案1】:

我不会导出全局指针变量,而是将它和您需要在 EXE 和 DLL 之间共享的其他变量打包到一个结构中,然后将指向该结构的指针作为函数参数传递给例如 DLL初始化函数。

// Function exported from the DLL.
// Called by the EXE during initialization.
//
// The DLL receives a pointer to the global state structure,
// shared between the EXE and the DLL.
//
BOOL YourDllInit(GlobalStuff* pGlobal);

【讨论】:

以上是关于全局外部指针变量在 DLL 中不可见的主要内容,如果未能解决你的问题,请参考以下文章

java调用dll,如何传入指针变量

C 语言指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )

关于变量的可见性和生命周期

c语言中不允许在函数外部给全局变量赋值

不同风格的递归,引用/全局/指针变量的使用

Sourceboost C中指向数组的全局变量指针