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

How to use publically exported global DLL variables?

假设我有 2 个简单的 classes 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" 我从这段代码中得到两个错误

我尝试在 class 定义中和 external 关键字之后写 __declspec(dllexport)。它无助于修复错误。所以我想知道应该怎么做才能编译这样的项目?

错误信息很清楚,与DLL或DLL无关import/export。您已声明 "external linkage" 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 中的 functions。在 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);