如何使用公开导出的全局DLL变量?

时间:2016-05-31 04:39:04

标签: c++ windows dll global-variables external

假设我有2个简单的类AC,我还有指向AC的指针形式的全局外部变量。代码:

//global.h
#pragma once
#include "A.h"
#include "C.h"
struct A;
struct C;
extern A* external_a;
extern C* external_c;
/////////////////////////////////////////
//A.h
#pragma once
struct A {
    void get();
};
/////////////////////////////////////////    
//A.cpp
#include "A.h"
void A::get() {}
/////////////////////////////////////////
//C.h
#pragma once
# include "global.h"
struct C {
    void doit();
};
/////////////////////////////////////////   
//C.cpp
# include "C.h"
void C::doit() { external_a->get(); }
/////////////////////////////////////////

我只列出了DLL代码。关键是DLL用户提供(声明)他的EXE代码说main.cpp全局变量供我的DLL代码使用。因此,当我想在DLL项目中的多个文件中使用外部变量时,用户不在同一个项目中。

我从此代码中收到有关unresolved external symbol "struct A * external_a"的两个错误 enter image description here

我曾尝试在课堂辩护中和__declspec(dllexport)关键字后写external。它无法解决错误。所以我想知道如何能够编译这样的项目?

1 个答案:

答案 0 :(得分:1)

错误消息是明确的,它与DLL或DLL导入/导出无关。您已声明"外部链接" extern A* external_a;,但外部链接到什么?

在你的* .cpp文件之一(通常是包含主入口点的文件)中,应该有一个全局变量的声明。如果您使用指针,那么您还必须分配它。例如

档案"main.cpp"

#include "a.h"

//Initialize pointer here:
MyStructA* global_a;
int main()
{
    //Allocate data here
    //(unless this is a DLL project and you are passing a variable)
    global_a = new MyStructA;
    foo();
    return 0;
}

(我将变量名改为global_a,这更有意义)

如果您想在同一项目中的其他文件中使用global_a,请使用extern MyStructA* global_a;。例如,在"otherfile.cpp"

#include "a.h"

extern MyStructA* global_a;
foo();
...

<小时/> 如果您有EXE项目和单独的DLL项目,则使用dllexport/dllimport访问DLL中的函数。在EXE项目中声明数据,然后使用函数传递数据。 extern在这种情况下无关紧要。例如:

在DLL项目中使用dllexport

MyStructA *global_a;

__declspec(dllexport) void foo(MyStructA *p)
{
    global_a = p;
}

在EXE项目中使用dllimport

__declspec(dllimport) void foo(MyStructA *p);

MyStructA A;
foo(&A);